C/C++ を使用して文字列パス "/user/desktop/abc/post/" から部分文字列を見つけるにはどうすればよいですか? そのパスにフォルダ「abc」が存在するかどうかを確認したい。
パスは文字ポインタですchar *ptr = "/user/desktop/abc/post/";
とを使用std::string
しfind
ます。
std::string str = "/user/desktop/abc/post/";
bool exists = str.find("/abc/") != std::string::npos;
C では、strstr()
標準ライブラリ関数を使用します。
const char *str = "/user/desktop/abc/post/";
const int exists = strstr(str, "/abc/") != NULL;
短すぎる部分文字列を誤って見つけないように注意してください (これが開始と終了のスラッシュの目的です)。
user1511510 さんが特定したように、abc がファイル名の末尾にあるという異常なケースがあります。/abc/
または のいずれかを探す必要があり、/abc
その後に string-terminator が続きます'\0'
。/abc/
これを行う単純な方法は、または/abc\0
が部分文字列かどうかを確認することです。
#include <stdio.h>
#include <string.h>
int main() {
const char *str = "/user/desktop/abc";
const int exists = strstr(str, "/abc/") || strstr(str, "/abc\0");
printf("%d\n",exists);
return 0;
}
but exists
will be 1 even if abc is not followed by a null-terminator. This is because the string literal "/abc\0"
is equivalent to "/abc"
. A better approach is to test if /abc
is a substring, and then see if the character after this substring (indexed using the pointer returned by strstr()
) is either a /
or a '\0'
:
#include <stdio.h>
#include <string.h>
int main() {
const char *str = "/user/desktop/abc", *substr;
const int exists = (substr = strstr(str, "/abc")) && (substr[4] == '\0' || substr[4] == '/');
printf("%d\n",exists);
return 0;
}
This should work in all cases.
配列を使いすぎている場合は、cstring.h
部分文字列の検索を含む機能が多すぎるため、含める必要があります。
C++ の場合
using namespace std;
string my_string {"Hello world"};
string element_to_be_found {"Hello"};
if(my_string.find(element_to_be_found)!=string::npos)
std::cout<<"Element Found"<<std::endl;