[英]How to find substring from string?
如何使用 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;
注意不要意外找到太短的子字符串(这是开始和结束斜线的用途)。
使用std::string
查找方法的示例:
#include <iostream>
#include <string>
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.
使用strstr(const char *s , const char *t)
和include<string.h>
您可以编写自己的函数,其行为与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;
}
正如 user1511510 所确定的那样,当 abc 位于文件名末尾时,这是一种不寻常的情况。 我们需要查找/abc/
或/abc
后跟字符串终止符'\\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;
}
但即使 abc 后面没有空终止符, exists
也将为 1。 这是因为字符串文字"/abc\\0"
等效于"/abc"
。 更好的方法是测试/abc
是否是子字符串,然后查看此子字符串后面的字符(使用strstr()
返回的指针索引)是/
或'\\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;
}
这应该适用于所有情况。
如果你过多地使用数组,那么你应该包含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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.