Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在字符串中查找多个子字符串时遇到问题_C++_String_Substring - Fatal编程技术网

C++ 在字符串中查找多个子字符串时遇到问题

C++ 在字符串中查找多个子字符串时遇到问题,c++,string,substring,C++,String,Substring,我试图编写一个程序,比较两个字符串(字符串和子字符串)和每次在字符串中找到子字符串时的刺激。但是,使用标准: if(str.find(substr) != string::npos) { count++; } 我遇到的问题是,如果子字符串在字符串中出现多次,它只会递增一次。因此,如果字符串为“test”,子字符串为“test”,则计数结果仅为1而不是4 解决这个问题的最佳方法是什么 *上下文注释: 1) 有一次,我一个字符一个字符地检查字符串,看它们是否匹配,但当我遇到一些单词中包含较小单词的

我试图编写一个程序,比较两个字符串(字符串和子字符串)和每次在字符串中找到子字符串时的刺激。但是,使用标准:

if(str.find(substr) != string::npos)
{
count++;
}
我遇到的问题是,如果子字符串在字符串中出现多次,它只会递增一次。因此,如果字符串为“test”,子字符串为“test”,则计数结果仅为1而不是4

解决这个问题的最佳方法是什么

*上下文注释:

1) 有一次,我一个字符一个字符地检查字符串,看它们是否匹配,但当我遇到一些单词中包含较小单词的问题时,我不得不放弃这一点

例如:“is”会在“this”一词中出现,等等

2) 这个较大的程序接受两个向量。第一个向量为每个元素都有一个字符串,这些元素是用户要输入的句子(在上面的示例中作用于主字符串)。第二个向量包含输入到第一个向量中的所有句子中的每个单词(作为上面示例中的子字符串)。不确定这一点是否重要,但我想我会把它扔进去

例如:

vector<string> str {this is line one, this is line two, this is line three};
vector<string> substr {is, line, one, this, three, two};
向量str{这是第一行,这是第二行,这是第三行}; 向量子{is,line,one,this,three,two};
3) 我在想,如果有什么方法可以做相反的事情=字符串::npos可以工作,但不确定它是否存在

您需要一个循环来查找给定字符串中某个子字符串的所有发生情况

但是,由于要区分作为整词的子字符串和较大单词中的子字符串,因此需要在比较之前解析字符串以确定整词

您可以使用和在所需的分隔符(空格、标点符号等)之间查找每个单词的开头和结尾索引。可以使用将这两个索引之间的子字符串与所需的子字符串进行比较。例如:

#包括
常量std::字符串delims=“,.”;
大小\u t计数字(常量标准::字符串和字符串,常量标准::字符串和单词)
{
std::string::size_type start=0,end;
大小\u t计数=0;
while((start=str.find_first_not_of(delims,start))!=std::string::npos)
{
end=str.find\u first\u of(delims,start+1);
if(end==std::string::npos)
{
if(str.compare(start,str.size()-start,word)=0)
++计数;
打破
}
if(str.compare(start,end start,word)==0)
++计数;
开始=结束+1;
}
返回计数;
}
或者,您可以将整个单词提取到a中,然后使用它来计算与子字符串匹配的元素数。例如:

#包括
#包括
#包括
常量std::字符串delims=“,.”;
大小\u t计数字(常量标准::字符串和字符串,常量标准::字符串和单词)
{
std::vec;
std::string::size_type start=0,end;
while((start=str.find_first_not_of(delims,start))!=string::npos)
{
end=str.find\u first\u of(delims,start+1);
if(end==std::string::npos)
{
向量推回(str.substr(start));
打破
}
向量推回(str.substr(开始,结束-开始));
开始=结束+1;
}
返回std::count(vec.begin(),vec.end(),word);
}

这是否回答了您的问题@JaMiT这些答案使用了
string::find()
,但没有用大词区分整个子字符串和小子字符串,而needs@JaMit嗯,我相信答案就在那里。。。但我很迷茫,试图遵循他们的代码。还有一个更简单的版本吗?@RemyLebeau这是真的,但我要加上“还”一词,比如“OP也需要”。一次回答两个问题(如何计算多次出现的次数以及如何忽略单词的适当子字符串)可能会很棘手。@DamnGoodCake你看到接受的答案了吗?很短,太好了!这正是我要找的#大商店