在给定字符串中查找子字符串

时间:2019-10-05 06:28:45

标签: c++

这是我的程序,用于查找人名中是否存在子字符串。搜索功能的实现对我来说似乎是正确的,但是,当我在代码块中运行搜索功能时,它仍然无法正常工作。没有编译错误,但在运行时无法正常工作。


 #include<iostream>
 #include<stdio.h>
 #include<string.h>
 using namespace std;
class Person
{
    char *name;
public:
    Person(char* n)
    {
       name=n;
    }
    bool search(char* substr)
    {
        char *str=name;
        while(*str!='\0')
        {   int count=0;
            if(*str==*substr)
            {   char *s=substr;
                char *p=str;

                while(*s!='\0')
                {
                  if(*p==*s)
                     {
                          count++;
                          p++;
                          s++;
                     }
                  else
                    break;
                }
            }
            if(count==strlen(substr))
            {
                cout<<name<<endl;
                return true;
            }
            str++;
        }
        return false;
    }
    void print()
    {
        cout<<name<<endl;
    }
};
int main()
{
    Person p("Akhil");
    char *s;
    cout<<"Enter substring to be found:"<<endl;
    gets(s);
    if(p.search(s))
        cout<<"Found!!!\n";
    else
        cout<<"Not Found!!!\n";
}

如果有人可以告诉我我在执行搜索功能时出错的地方,这将非常有帮助。我不能使用我的作业中提到的标准库函数来实现它。

3 个答案:

答案 0 :(得分:0)

对代码进行了一些更改,最终实现了。 使用了const char name;如第p人(“ Akhil”)中所述;从'const char '到'char *'

的无效转换
#include<iostream>
#include<stdio.h>
#include<string.h>

class Person
{
    const char *name;
public:
    Person(const char* n)
    {
       name=n;
    }
    bool search(char* substr)
    {
        const char *str=name;
        while(*str!='\0')
        {   int count=0;

            if(*str==*substr)
            {   char *s=substr;
                const char *p=str;
                while(*s!='\0')
                {
                  if(*p==*s)
                     {
                          count++;
                          p++;
                          s++;
                     }
                  else
                    break;
                }
            }
            if(count==strlen(substr))
            {
                cout<<name<<endl;
                return true;
            }
            str++;
        }
        return false;
    }
    void print()
    {
        cout<<name<<endl;
    }
};
int main()
{
    Person p("Akhil");
    char* s;
    cout<<"Enter substring to be found:"<<endl;
    gets(s);
    if(p.search(s))
        cout<<"Found!!!\n";
    else
        cout<<"Not Found!!!\n";
}

我得到的输出:

Enter substring to be found:
kh
Akhil
Found!!!

--------------------------------
Process exited with return value 0
Press any key to continue . . .

使用的软件:Dev-C ++ 5.4.2

使用的编译器:编译器:TDM-GCC 4.7.1 64位版本

答案 1 :(得分:0)

您必须在while循环内部添加另一个条件。

while(*s != '\0' && *p != '\0')
{
    if(*p == *s)
    {
        count++;
        p++;
        s++;
    }
    else
        break;
}

原因是您可以在到达p的结尾之前到达s的结尾。例如,如果字符串为Akhil,而要找到的子字符串为ill

答案 2 :(得分:0)

猜测:问题在于您如何读取字符串。 gets()从c ++ 11开始不推荐使用,从c ++ 14 as you can read here开始删除。您应该使用std::cin(因为允许输出使用std::cout,这也应该被允许吗?):

std::string s;
std::cin >> s;
if(p.search(s.c_str()))
...

问题可能是,gets将从控制台读取输入并将其放置在您提供的缓冲区中。但是由于您没有初始化缓冲区s,所以会得到不确定的行为。

此外,由于不打算修改任何字符串,因此应将char *替换为const char*

也请避免使用using namespace std