【问题标题】:Error while using fgets in C在 C 中使用 fgets 时出错
【发布时间】:2013-10-05 01:42:56
【问题描述】:

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

下面的代码做了什么:

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

  2. 程序应该打印的是:Word we are looking for.

  3. 但它给了我一个分段错误(核心转储)错误。

我怀疑我错误地使用了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 &lt;&lt;%s&gt;&gt; in &lt;&lt;%s&gt;&gt;\n", lname, fname); 会显示搜索到的字符串中有一个换行符(needle),以及搜索到的字符串末尾有一个换行符(haystack)。
  • 复制粘贴太多;你剥离fname 两次,而lname 根本没有。此外,没有理由将answer 设为全局变量,也没有理由在当前代码中包含&lt;ctype.h&gt;&lt;stdlib.h&gt;

标签: c scanf fgets


【解决方案1】:

您没有检查来自strcasestr() 的失败,这是失败的,因为您没有从输入中删除\n\r\n

唯一成功的搜索是它是否匹配第一个输入的结尾。

剥离 CRLF:

void strip_crlf(char* s)
{
    char* p = strpbrk(s, "\r\n");
    if (p) *p = '\0';
}

然后在fgets 之后只是strip_crlf(fname);lname 也一样。

【讨论】:

  • 我刚刚检查了失败案例,它确实失败了或出于某种原因..dono 为什么...我试试上面的代码并回复你。谢谢!
【解决方案2】:

您需要在尝试打印结果之前检查比较是否成功:

if (answer) {
    printf("%s\n", answer);
} else {
    printf("No match\n");
}

比较失败的原因可能是因为fgets() 在缓冲区中包含换行符,但scanf() 没有。如果您不希望它弄乱比较,则需要删除字符串末尾的换行符。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2020-03-10
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多