在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,随后会保留为单个空格。它适用于AliceAbba 【参考方案1】:

因为在某些情况下a+k超过了字符串st1的长度:

if (st1[a + k] == subst1[k]) 
    message = "True";

在执行此语句之前,验证是否a + k &lt; 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 字符串中的子字符串出现的次数和位置

如何在批处理文件中的for循环中使用可变长度的子字符串?

在Windows批处理中的循环中使用变量替换另一个变量中的子字符串

c语言中如何在一个字符串中查找/出现的位置?需要第一次出现和第二次出现中间的内容和第二次出现和第三

循环遍历列表中的字符串