虽然scanf!= EOF或scanf == 1?

时间:2010-11-11 22:39:33

标签: c scanf

Ceteris paribus (格式良好的数据,良好的缓冲实践以及什么不是),我有理由在scanf的返回值为1而不是{{ 1}?我可能已经在某个地方读过这个,或者其他什么,但我也可能错了。别人怎么想?

3 个答案:

答案 0 :(得分:14)

scanf会返回成功转换的项目数...或出错时的EOF。因此,以有意义的方式对条件进行编码。

scanfresult = scanf(...);
while (scanfresult != EOF) /* while scanf didn't error */
while (scanfresult == 1) /* while scanf performed 1 assignment */
while (scanfresult > 2) /* while scanf performed 3 or more assignments */

受挫的例子

scanfresult = scanf("%d", &a);
/* type "forty two" */
if (scanfresult != EOF) /* not scanf error; runs, but `a` hasn't been assigned */;
if (scanfresult != 1) /* `a` hasn't been assigned */;

编辑:添加了另一个更人为的例子

int a[5], b[5];
printf("Enter up to 5 pairs of numbers\n");
scanfresult = scanf("%d%d%d%d%d%d%d%d%d%d", a+0,b+0,a+1,b+1,a+2,b+2,a+3,b+3,a+4,b+4);
switch (scanfresult) {
case EOF: assert(0 && "this didn't happen"); break;
case 1: case 3: case 5: case 7: case 9:
    printf("I said **pairs of numbers**\n");
    break;
case 0:
    printf("What am I supposed to do with no numbers?\n");
    break;
default:
    pairs = scanfresult / 2;
    dealwithpairs(a, b, pairs);
    break;
}

答案 1 :(得分:1)

取决于您想要对格式错误的输入执行的操作 - 如果您的扫描模式不匹配,则可以返回0。因此,如果您在循环外处理该情况(例如,如果您将其视为输入错误),则与1进行比较(或者您的scanf调用中有多少项目。)

答案 2 :(得分:0)

来自http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

  

成功时,函数返回   成功阅读的项目数量。这个   count可以匹配预期的数量   读数或更少,甚至为零,如果a   匹配失败发生。在这种情况下   任何数据之前的输入失败   可以成功阅读,EOF是   返回。

确保您阅读预期项目数量的唯一方法是将返回值与该数字进行比较。