C ++-字符串是否包含单词-具有简单循环?

时间:2018-10-28 13:21:54

标签: c++ string substring

//编辑

  • 下面的代码仅在str1只有1个str2开头字母的情况下有效;如何解决?

  • 例如如果str1 / 2 =溢出/浮动,则可以正常工作。

  • 但是如果str1超过 f f abc(具有两个“ f”)->则无效

// 我需要使用简单循环检查字符串中的单词。这个想法是:

  • 在str1中找到一个等于1的元素。
  • 如果存在,则将flag设置为1,如果以下元素也相等,则将其保留为1。如果不是,则将标志设置为0。

#include <iostream>
using namespace std;

int main() {
    string str1, str2;
    int flag;
    cout << "Enter a string 1: ";
    getline(cin, str1);
    cout << "Enter a string 2: ";
    getline(cin, str2);

    for(int i = 0; i < str1.size(); i++)
    {
        if (str1[i] == str2[0])   // find element in str1 that is equal to first element of str2
        {
            flag = 1;  // 
            for(int j = i+1; j < i + str2.size(); j++)
                if (str1[j] != str2[j-i])  // checking if following elements are also equal
                {
                    flag = 0; // if any of them is not equal
                    break;
                }

            if (flag==1)    
                cout << "str2 is Substring of str1" ;
            else
                cout << "str2 is NOT Substring" ;
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

bool isSubStr(const string& parent, const string& child)
{
    // Check each starting position
    for (int i=0; i<(parent.size()-child.size()+1); ++i)
    {
        // Check if the substring starts at this position
        // TODO make this a helper method to avoid the need for a flag
        bool isSubString = true;
        for (int j=0; j<child.size(); ++j)
        {
            if (parent[i + j] != child[j])
            {
                isSubString = false;
                break;
            }
        }
        if (isSubString)
        {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:0)

C ++中的字符串类包含一个名为 find 的函数,我认为应该使用该函数。

可以找到文档here

关于返回值的摘录:

  

第一个匹配项的第一个字符的位置。
如果没有匹配项   找到后,该函数返回string :: npos。

#include <iostream>

using namespace std;

int main() {

    string str1, str2;

    cout << "Enter a string 1: ";
    getline(cin, str1);

    cout << "Enter a string 2: ";
    getline(cin, str2);

    size_t found = str1.find(str2);
    if (found != string::npos)
        cout << "str2 is Substring of str1" << endl;
    else
        cout << "str2 is NOT Substring" << endl;

    return 0;
}

它更短,更容易理解。那么为什么不这样做呢?

否则,我认为您的代码在多个方面都是不正确的;例如

  • 您可以根据for循环中的flag变量打印出文本。这对我来说不合适。
  • 第二个for循环对我来说很奇怪。我相信您正在尝试编写一些您认为可能成熟且经过深思熟虑的程序。老实说,我建议不要尝试这样做。简单明了。

在您发表评论之后,我花了一些时间来尝试改进您的代码。

#include <iostream>
using namespace std;

int main() {

    string str1, str2;
    int flag = 0;

    cout << "Enter a string 1: ";
    getline(cin, str1);

    cout << "Enter a string 2: ";
    getline(cin, str2);

    for(unsigned int i = 0; i < str1.size(); i++) {
        if (str1[i] == str2[0]) { // find element in str1 that is equal to first element of str2
            unsigned int j = 0;
            for( ; j < str2.size(); j++) {
                if ( str1[i+j] != str2[j] ) {  // checking if following elements are also equal
                    break;
                }
            }
            if ( j == str2.size() ) { // if j equals the size of substring then all chars seem equal
                flag = 1;
                break;
            }
        }
    }

    if ( flag )
        cout << "str2 is Substring of str1" ;
    else
        cout << "str2 is NOT Substring" ;

    return 0;
}