19

C/C++ を使用して文字列パス "/user/desktop/abc/post/" から部分文字列を見つけるにはどうすればよいですか? そのパスにフォルダ「abc」が存在するかどうかを確認したい。

パスは文字ポインタですchar *ptr = "/user/desktop/abc/post/";

4

7 に答える 7

39

とを使用std::stringfindます。

std::string str = "/user/desktop/abc/post/";
bool exists = str.find("/abc/") != std::string::npos;
于 2012-11-02T12:35:16.060 に答える
18

C では、strstr()標準ライブラリ関数を使用します。

const char *str = "/user/desktop/abc/post/";
const int exists = strstr(str, "/abc/") != NULL;

短すぎる部分文字列を誤って見つけないように注意してください (これが開始と終了のスラッシュの目的です)。

于 2012-11-02T12:35:35.383 に答える
0

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.

于 2012-11-02T16:52:14.727 に答える
-1

配列を使いすぎている場合は、cstring.h部分文字列の検索を含む機能が多すぎるため、含める必要があります。

于 2012-11-02T14:12:30.040 に答える
-1

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;
于 2020-06-26T04:17:00.433 に答える