【问题标题】:find substring in a string with loops in c++在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

标签: c++ string string-matching


【解决方案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 我怀疑它,所以我已经编辑了一个循环方法。比较成功的诀窍是所有字符必须相等,但第一个不同的字符意味着它失败了。
    猜你喜欢
    • 2015-11-28
    • 2014-08-12
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多