在C中使用fgets时出错

时间:2013-10-05 01:42:57

标签: c scanf fgets

我正在编写一个小程序来检查函数strcasestr的工作原理。

以下代码的作用:

  1. 要求用户输入一行文字 示例第一个输入:blah bla blah blah the Word we are looking for. 示例第二个输入:Word

  2. 该程序应打印的内容为:Word we are looking for.

  3. 但是它给了我一个Segmentation fault(core dumped)错误。

  4. 我怀疑我错误地使用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:程序现在可以使用了。感谢大家的帮助!

2 个答案:

答案 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()没有。如果您不希望它破坏比较,您需要删除字符串末尾的换行符。