我无法让这个短程序运行。它并不完整,但我想解决编译时遇到的段错误。其要点如下:
在命令行上读取(子)字符串,并在标准输入上的每个“单词”中搜索该(子)字符串。包含此(子)字符串的每个单词都会被打印。如果找不到匹配项,则会输出相应的消息。另外,如果命令行参数少于或多于一个,则会输出一条用法消息。
我知道尝试访问不存在的索引或无限循环可能会导致段错误。一点点错误测试表明问题确实出在 while 循环中,但我不明白为什么。
结果是当我输入: ./match ant < match.data
进入命令行,输入 match.data
持有
fantastic
dog
x
gooblygooblygoo
antx
xant
ant
anananananananananananan
当fgets到达match.data的末尾时,是否不返回NULL并终止循环?
谢谢!
最佳答案
您的代码有两个问题:
您在
fgets
调用中使用了未初始化的指针(数组中的指针均未初始化)您正在指针中执行
sizeof
,它返回指针的大小,而不是它所指向的内容。
解决第一个问题是为数组内部的指针分配内存。这可以通过动态分配(例如使用malloc
)或使其成为数组的数组来完成。
当第一点解决后,解决第二点就很容易了,因为你就知道了字符串的大小。
<小时/>仔细阅读你的代码,你实际上初始化了数组中的第一个指针,当你让它指向一个由五个字符组成的常量(只读)数组时,字 rune 字“NOPE”
。除了有undefined behavior当使用未初始化的数据时,当您尝试写入只读内存时,您会遇到另一种情况(如果第一个输入超过四个字符,则可能会超出范围)。
关于c - fgets、seg 错误和字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25452333/