如何从字符串中查找子字符串?

如何使用C / C ++从字符串路径“/ user / desktop / abc / post /”中找到子字符串? 我想检查该路径中是否存在“abc”文件夹。

路径是字符指针char *ptr = "/user/desktop/abc/post/";

在C中,使用strstr()标准库函数:

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

注意不要意外地找到太短的子串(这是起始和结束斜杠的用途)。

使用std::stringfind

 std::string str = "/user/desktop/abc/post/"; bool exists = str.find("/abc/") != std::string::npos; 

使用std::string查找方法的示例:

 #include  #include  int main (){ std::string str ("There are two needles in this haystack with needles."); std::string str2 ("needle"); size_t found = str.find(str2); if(found!=std::string::npos){ std::cout << "first 'needle' found at: " << found << '\n'; } return 0; } 

结果:

 first 'needle' found at: 14. 

正如user1511510已经识别的那样,当abc位于文件名的末尾时,会出现exception情况。 我们需要查找/abc//abc后跟一个字符串终止符'\0' 。 一个天真的方法是检查/abc//abc\0是否为子串:

 #include  #include  int main() { const char *str = "/user/desktop/abc"; const int exists = strstr(str, "/abc/") || strstr(str, "/abc\0"); printf("%d\n",exists); return 0; } 

但即使abc后面没有空终止符, exists也会为1。 这是因为字符串文字"/abc\0"等同于"/abc" 。 更好的方法是测试if /abc是否为子字符串,然后查看此子字符串后面的字符(使用strstr()返回的指针索引)是/'\0'

 #include  #include  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; } 

这应该适用于所有情况。

使用strstr(const char *s , const char *t)include

您可以编写自己的函数,其行为与strstr相同,您也可以根据您的要求进行修改

 char * str_str(const char *s, const char *t) { int i, j, k; for (i = 0; s[i] != '\0'; i++) { for (j=i, k=0; t[k]!='\0' && s[j]==t[k]; j++, k++); if (k > 0 && t[k] == '\0') return (&s[i]); } return NULL; } 

如果你过多地使用数组,那么你应该包含cstring.h因为它有太多的function,包括查找子串。