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

C++ 在给定字符串中查找子字符串,c++,C++,这是我的程序,用于查找人名中是否存在子字符串。搜索函数的实现在我看来似乎是正确的,但当我在代码块中运行它时,它仍然不起作用。没有编译错误,但在运行时无法正常工作 #包括 #包括 #包括 使用名称空间std; 班主任 { 字符*名称; 公众: 个人(字符*n) { name=n; } 布尔搜索(字符*子字符) { char*str=名称; 而(*str!='\0') {int count=0; 如果(*str==*substr) {char*s=substr; char*p=str; 而(*s!

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


#包括
#包括
#包括
使用名称空间std;
班主任
{
字符*名称;
公众:
个人(字符*n)
{
name=n;
}
布尔搜索(字符*子字符)
{
char*str=名称;
而(*str!='\0')
{int count=0;
如果(*str==*substr)
{char*s=substr;
char*p=str;
而(*s!='\0')
{
如果(*p==*s)
{
计数++;
p++;
s++;
}
其他的
打破
}
}
如果(计数==strlen(substr))
{

cout对我这边的代码做了一些修改。 使用const char name;如在Person 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";
}
使用的软件:Dev-C++5.4.2


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

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

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

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

Wild guess:问题在于如何读取字符串。
gets()
自c++11起被弃用,并从c++14起被删除。您应该使用
std::cin
(因为您允许对输出使用
std::cout
,所以也应该允许这样做):

问题可能是,
gets
将从控制台读取输入并将其放入您提供的缓冲区中。但由于您没有初始化缓冲区
s
,因此会出现未定义的行为

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


还要避免
使用命名空间std

为什么不使用
if(s1.find(s2)!=std::string::npos){std::cout在我的作业中,提到自己实现搜索函数而不使用任何标准的库函数。问家庭作业问题是可以的,但是你必须提到你需要自己实现,而不是使用库函数。对不起,我是这里的新手。我将从下一个tim开始处理这个问题e、 您也可以编辑您的问题以立即添加它;)不相关,但您应该查看一下您使用命名空间std删除了
,但仍然编写
cout
,而不是
std::cout
,因此它甚至不编译。此外,您使用的是过时的
get
,带有未初始化的缓冲区
s
->未定义的行为不,但在这种情况下,当*p!=*s.Ah正确时,循环将自动中断,它适用于C样式的字符串,但不适用于类字符串的迭代器。
Enter substring to be found:
kh
Akhil
Found!!!

--------------------------------
Process exited with return value 0
Press any key to continue . . .
while(*s != '\0' && *p != '\0')
{
    if(*p == *s)
    {
        count++;
        p++;
        s++;
    }
    else
        break;
}
std::string s;
std::cin >> s;
if(p.search(s.c_str()))
...