c - fgets、seg 错误和字符串数组

标签 c fgets

我无法让这个短程序运行。它并不完整,但我想解决编译时遇到的段错误。其要点如下:

在命令行上读取(子)字符串,并在标准输入上的每个“单词”中搜索该(子)字符串。包含此(子)字符串的每个单词都会被打印。如果找不到匹配项,则会输出相应的消息。另外,如果命令行参数少于或多于一个,则会输出一条用法消息。

我知道尝试访问不存在的索引或无限循环可能会导致段错误。一点点错误测试表明问题确实出在 while 循环中,但我不明白为什么。

结果是当我输入: ./match ant < match.data进入命令行,输入 match.data持有

fantastic dog x gooblygooblygoo antx xant ant anananananananananananan

当fgets到达match.data的末尾时,是否不返回NULL并终止循环?

谢谢!

enter image description here

最佳答案

您的代码有两个问题:

  1. 您在fgets调用中使用了未初始化的指针(数组中的指针均未初始化)

  2. 您正在指针中执行 sizeof,它返回指针的大小,而不是它所指向的内容。

解决第一个问题是为数组内部的指针分配内存。这可以通过动态分配(例如使用malloc)或使其成为数组的数组来完成。

当第一点解决后,解决第二点就很容易了,因为你就知道了字符串的大小。

<小时/>

仔细阅读你的代码,你实际上初始化了数组中的第一个指针,当你让它指向一个由五个字符组成的常量(只读)数组时,字 rune 字“NOPE”。除了有undefined behavior当使用未初始化的数据时,当您尝试写入只读内存时,您会遇到另一种情况(如果第一个输入超过四个字符,则可能会超出范围)。

关于c - fgets、seg 错误和字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25452333/

相关文章:

c - "printf"在任何 INT 10h 中断调用后无法正常工作

使用 scanf() 检查 C 中的用户输入

c - malloc + fgets 动态分配

c - 在 C 中读取十六进制文件

c - 为什么gets 函数如此危险以至于不应该使用它?

c - 从 NetBeans 启动 C 应用程序时重定向标准输入

c - C语言递归中static关键字的使用

c - 分配给缓冲区时 fgets 泄漏

c - fgets、sscanf 和写入数组

c - void *array = *(void **) member + siz * (*p_n); 的目的是什么?