2015-11-08 21 views
-1

我有一个C程序需要读取两行用户输入。第一行是3个数字,空格分隔,第二行是单个数字。事情是这样的:读取用户输入的单独行c

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

你有没有用它调试器?例如'valgrind'会打印出发生错误内存操作的地方。无论你的输入数据分成多行(假设第一行有2个数字),你仍然试图从这行中得到3个值,因为你从不检查什么是strtok返回的(如果它返回NULL,atoi会显示段错误,显然... )。 – hexasoft

+2

'scanf(“%d%d%d%d”,&a,&b,&c,&d);'而不是。 – BLUEPIXY

+1

@BLUEPIXY,答案不应在评论中。 – pgreen2

回答

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); 
}