尝试逐行读取文件, 文件中的一行如下所示:
InputVector:0(1,3,4,2,40)
代码:
FILE *file = fopen(filename, "r");
char buff[26];
char *token;
while(fgets(buff, 26, (FILE*)file) != NULL) {
buff[strlen(buff)] = '\0';
printf("%s\n", buff);
token = strtok(buff, INV_DELIM1);
printf("%s\n", token);
token = strtok(NULL, INV_DELIM2);
printf("%s\n", token);
while(token != NULL) {
token = strtok(NULL, INV_DELIM3);
printf("%s\n", token);
}
}
我的猜测是,在 while 循环中 strtok()
在最后一个数字之后没有返回 NULL
并继续运行并导致段错误。我尝试在 fgets()
之后将 "\0"
添加到 buff
的末尾,但没有执行任何操作。
delim1: ":",
delim2: "(",
delim3: ",)"
我得到的输出是
InputVector:0(1,3,4,2,40)
InputVector
0
1
3
4
2
40
segfault
最佳答案
您反复使用如下代码:
token = strtok(NULL, INV_DELIM2);
printf("%s\n", token);
如果strtok()
返回 NULL,然后将其传递给 printf()
,由于 %s
,它期望获得一个指向有效的以 0 结尾的字符串的指针。在格式参数中。 NULL 不是指向有效的以 0 结尾的字符串的指针,因此会发生不好的事情,在您的情况下表现为崩溃。
解决方案:确保strtok()
返回的指针在尝试使用它之前不为 NULL。
对 future 的建议:了解如何使用调试器单步执行代码,并习惯使用valgrind来帮助跟踪内存问题。当您可以使用工具找出问题所在并准确了解问题所在时,您不必对发生的情况做出错误的猜测。
关于c 使用 fgets、strtok 读取文件导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289809/