C++ - 字符串是不是包含一个单词 - 带有简单循环?

Posted

技术标签:

【中文标题】C++ - 字符串是不是包含一个单词 - 带有简单循环?【英文标题】:C++ - does string contain a word - with simple loop?C++ - 字符串是否包含一个单词 - 带有简单循环? 【发布时间】:2018-10-28 13:21:54 【问题描述】:

//编辑

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

例如。如果 str1 / 2 = 溢出 / 浮动它可以工作。

但如果 str1 超过flowfabc(有两个“f”)--> 它不起作用

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

在str1中找到一个等于1的元素。str2的元素 如果存在,我们设置flag = 1,如果后面的元素也相等,它保持为1。如果不是,则 flag 设置为 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;

【问题讨论】:

你调试你的程序了吗?你有没有用铅笔和一些纸写出它的逻辑?如果没有,您应该立即执行此操作 for(int j = i+1; i &lt; i + str2.size(); i++) -- 这个循环看起来很奇怪,混合ij 就像这样,因为它嵌套在for(int i = 0; i &lt; str1.size(); i++) str1.find(str2)?我一定是错过了什么...... 确实,为什么要重新发明***... @EddieIM for(int j = i+1; j &lt; i + str2.size(); i++) -- 所以这不再是错字了吗? i++j 循环中在那里做什么?这就是为什么您永远不应该输入代码的原因——将代码直接从编辑器复制并粘贴到 *** 编辑窗口中。 【参考方案1】:
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;

【讨论】:

【参考方案2】:

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 循环中的标志变量打印出文本。我觉得这不合适。 第二个 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;

【讨论】:

谢谢,我当然知道有函数,但我必须只使用循环找到解决方案,不允许使用函数和指针 我在答案中添加了改进的源代码。我希望这会有所帮助。

以上是关于C++ - 字符串是不是包含一个单词 - 带有简单循环?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 检查字符串是不是包含至少 1 个数字和 1 个字母

pandas loc 检查值是不是包含多个单词或字符串中的任何一个

正则表达式匹配带有标点的单词,但不是单独的标点

Javascript/jQuery 检查字符串是不是包含一个单词或出现的可选单词之一

检查字符串是不是包含破折号并在单词中添加双引号

有没有更简单的方法来过滤非字母字符? C++