在c ++中使用循环查找字符串中的子字符串
Posted
技术标签:
【中文标题】在c ++中使用循环查找字符串中的子字符串【英文标题】:find substring in a string with loops in c++ 【发布时间】:2016-02-01 03:22:39 【问题描述】:代码将从用户那里获取两个字符串并检查字符串,是否包含子字符串作为第二个输入。
string st1;
string subst1;
string message = " ";
cout << "Enter string and subst:";
cin >> st1;
cin >> subst1;
for (int a=0; a < st1.length(); a++)
if (st1[a] == subst1[0])
for (int k = 0; k < subst1.length(); k++)
if (st1[a + k] == subst1[k])
message = "True";
else
message = "False";
cout << message;
此代码不适用于“alice”和“ba”等输入。输出应该是假的但是当我执行代码时程序直接结束了
【问题讨论】:
如果您的代码从未将str1[a] == subst1[0]
评估为true
,那么message
将不会设置为false,随后会保留为单个空格。它适用于Alice
和Abba
。
【参考方案1】:
因为在某些情况下a+k超过了字符串st1的长度:
if (st1[a + k] == subst1[k])
message = "True";
在执行此语句之前,验证是否a + k < st1.length()
还有一句话:
当message
变为False
时,您必须停止比较,否则变量message
可能再次变为True
。
【讨论】:
【参考方案2】:为什么不用find()
:
string st1, subst1, message=" ";
cout<<"Enter string and subst:";
cin>>st1>>subst1;
if (st1.find(subst)==string::npos)
message="Not found";
else message ="Found";
如果不允许你使用这种方法,那么我建议你如下:
string st1, subst1, message=" ";
bool found=false;
cout<<"Enter string and subst:";
cin>>st1 >>subst1;
for (int a=0; !found && a<st1.length();a++)
if (st1[a]==subst1[0])
found = true; // there's some hope
for (int k=0; found && k<subst1.length(); k++)
if (a+k>=st1.length() || st1[a+k]!=subst1[k]) // oops! might overflow or fail
found = false; // this will also end the inner loop
message = found ? "True":"False";
cout<< message<<endl;
原则是要成功比较,所有字符必须相等。但如果单个字符失败,则应停止失败的比较。
这里是live demo
【讨论】:
我找到了这个解决方案,但我想使用循环来编写解决方案 @moreeff 我怀疑它,所以我已经编辑了一个循环方法。比较成功的诀窍是所有字符必须相等,但第一个不同的字符意味着它失败了。以上是关于在c ++中使用循环查找字符串中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章
在Javascript中查找不包含/ indexOf / Regex的字符串中的子字符串
怎么查找一个string 字符串中的子字符串出现的次数和位置
在Windows批处理中的循环中使用变量替换另一个变量中的子字符串