我正在编写一个小程序来检查函数strcasestr的工作原理。
以下代码的作用:
要求用户输入一行文字
示例第一个输入:blah bla blah blah the Word we are looking for.
示例第二个输入:Word
该程序应打印的内容为:Word we are looking for.
但是它给了我一个Segmentation fault(core dumped)错误。
我怀疑我错误地使用fgets()
。当我使用scanf
运行程序来读取输入时(当然输入第一个没有空格的输入)它可以工作并给我预期的输出。
知道是什么导致了分段错误错误吗?如何纠正这个?
#define _GNU_SOURCE
#define max_buff 1000
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char *answer;
//char * strcasestr (const char *haystack, const char *needle);
void strip_crlf(char* s);
void strip_crlf(char* s)
{
char* p = strpbrk(s, "\r\n");
if (p) *p = '\0';
}
int main(){
char fname[max_buff+1];
char lname[max_buff+1];
printf("Enter the line of text you are searching for ");
//scanf("%s", fname);
fgets(fname,max_buff,stdin);
//printf("%s",fname);
strip_crlf(fname);
printf("Enter the search term ");
//scanf("%s", lname);
fgets(lname,max_buff,stdin);
strip_crlf(lname);
//printf("%s",lname);
if((answer=strcasestr(fname,lname))!=NULL){
// printf("now we have something in answer ");
printf("%s\n",answer);
}
else
printf(" strcasestr failed\n");
}
已编辑:反映以下评论/答案中提出的建议。该程序现在打印:
strcasestr failed
... Ughh。
Edit2:程序现在可以使用了。感谢大家的帮助!
答案 0 :(得分:2)
您没有检查strcasestr()
失败的失败,因为您没有从输入中删除\n
或\r\n
。
唯一能成功的搜索是它是否匹配第一个输入的结尾。
剥离CRLF:
void strip_crlf(char* s)
{
char* p = strpbrk(s, "\r\n");
if (p) *p = '\0';
}
然后在strip_crlf(fname);
之后fgets
。与lname
相同。
答案 1 :(得分:2)
在尝试打印结果之前,您需要检查比较是否成功:
if (answer) {
printf("%s\n", answer);
} else {
printf("No match\n");
}
比较失败的原因可能是因为fgets()
在缓冲区中包含换行符,但scanf()
没有。如果您不希望它破坏比较,您需要删除字符串末尾的换行符。