这是我的程序,用于查找人名中是否存在子字符串。搜索功能的实现对我来说似乎是正确的,但是,当我在代码块中运行搜索功能时,它仍然无法正常工作。没有编译错误,但在运行时无法正常工作。
#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";
}
如果有人可以告诉我我在执行搜索功能时出错的地方,这将非常有帮助。我不能使用我的作业中提到的标准库函数来实现它。
答案 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
。