【发布时间】:2013-10-05 01:42:56
【问题描述】:
我正在编写一个小程序来检查函数strcasestr 的工作原理。
下面的代码做了什么:
要求用户输入一行文本。
第一个输入示例:blah bla blah blah the Word we are looking for.第二个输入示例:Word程序应该打印的是:
Word we are looking for.但它给了我一个分段错误(核心转储)错误。
我怀疑我错误地使用了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");
}
已编辑:反映以下 cmets/answers 中提出的建议。程序现在打印:
strcasestr failed
...呃。
Edit2:程序现在可以运行。感谢大家的帮助!
【问题讨论】:
-
仅供参考,您不需要
max_buff+1,因为fgets()从size参数中减去1。 -
你检查过
answer不是NULL吗? -
@Barmar 啊是的。忘了把它改回来 b4 在这里张贴我。不,我没有。但是 strcasestr 只有在找不到匹配项时才会这样做。有了这些输入,它应该能够找到匹配项?
-
您应该正式检查每个
fgets()是否成功。您可以在键入输入时不这样做,但您应该使您的程序不会因为早期的 EOF 而失败。你应该检查strcasestr()返回的内容。在调试问题以打印您实际获得的输入时,这也是一个好主意,这样您就可以检查您得到的内容是否符合您的预期。例如:printf("Search for <<%s>> in <<%s>>\n", lname, fname);会显示搜索到的字符串中有一个换行符(needle),以及搜索到的字符串末尾有一个换行符(haystack)。 -
复制粘贴太多;你剥离
fname两次,而lname根本没有。此外,没有理由将answer设为全局变量,也没有理由在当前代码中包含<ctype.h>或<stdlib.h>。