我有一个C程序需要读取两行用户输入。第一行是由空格分隔的3个数字,第二行是单个数字。像这样:
2 5 7
6
这是我的代码:
int main(int argc, char** argv){
int a, b, c, d;
char line[256];
while(fgets(line, sizeof(line), stdin)){
a = atoi(strtok(line, " "));
b = atoi(strtok(NULL, " "));
c = atoi(strtok(NULL, " "));
}
scanf("%d", &d);
printf("a : %d b: %d c: %d d: %d",a, b, c, d);
}
这个程序最终给了我一个Segmentation Fault 11
答案 0 :(得分:2)
while
循环的第二次迭代将读取第二行,即只有一个整数的行。这意味着,在第一个strtok
之后的任何后续调用将返回NULL
和atoi(NULL)
将调用未定义的行为(此处为分段错误的形状)。
假设文件的格式与您描述的文件完全相同,只需删除while
循环:
int main(int argc, char** argv){
int a, b, c, d;
char line[256];
fgets(line, sizeof(line), stdin));
a = atoi(strtok(line, " "));
b = atoi(strtok(NULL, " "));
c = atoi(strtok(NULL, " "));
scanf("%d", &d);
printf("a : %d b: %d c: %d d: %d",a, b, c, d);
}