在c中读取单独的用户输入行

时间:2015-11-08 16:07:53

标签: c segmentation-fault scanf

我有一个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

1 个答案:

答案 0 :(得分:2)

while循环的第二次迭代将读取第二行,即只有一个整数的行。这意味着,在第一个strtok之后的任何后续调用将返回NULLatoi(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);
}