【发布时间】:2019-02-16 18:40:34
【问题描述】:
尝试逐行读取文件, 文件中的一行如下所示:
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
【问题讨论】:
-
这不是已经导致了 SegFault
buff[strlen(buff)] = '\0';吗? -
在尝试使用该指针之前,您永远不会检查
strtok()是否返回空指针。 -
在
while循环中,反转printf和strtok -
buff[strlen(buff)] = '\0';没用。如果buff已经是NUL-终止,它什么也不做。如果buff尚未被NUL终止,则它是未定义的行为。
标签: c io segmentation-fault fgets strtok