【发布时间】:2021-07-15 21:51:47
【问题描述】:
我正在尝试从文本文件中读取两个数字。我用的是strtok,分隔符是" "。文本文件(名为data.txt)文件只有两个数字,行是"3 5"。但是程序崩溃了……感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
FILE *data;
data = fopen("data.txt", "r");
int m, n;
char *line, *number;
while(!feof(data))
{
fscanf(data, "%s", line);
number = strtok(line, " ");
m = atoi(number);
number = strtok(NULL, " ");
n = atoi(number);
}
}
【问题讨论】:
-
line是一个指针。它指向什么变量或内存空间? -
另见stackoverflow.com/q/5431941/10622916。一般来说,您应该检查所有返回值以确保没有发生错误。
-
while(!feof(data))在任何读取出现未定义行为之前,请检查 fscanf 返回的值。 -
如果你只是去
strtok,你不妨在scanf中使用"%d%d"。但是如果你打算使用%s,你必须添加一个比缓冲区大小小一的最大字段宽度。例如char line[32]; ... scanf("%31s", line);。由于您为缓冲区分配了零,因此显然存在问题。 -
@bruno while(!feof(data)) before any read has an undefined behavior 不受 C 规范支持。
fopen()--> “流的错误和文件结束指示符已清除。”和feof()“函数测试流指向的流的文件结束指示符。”它定义明确,即使它不是 OP 应该做的。