【问题标题】:While scanf!=EOF or scanf==1?虽然 scanf!=EOF 或 scanf==1?
【发布时间】:2010-11-11 22:39:33
【问题描述】:

Ceteris paribus(格式良好的数据、良好的缓冲实践等等),我是否更喜欢在 scanf 的返回值为 1 而不是 !EOF 时循环?我可能在某处或其他地方读过这个,但我也可能错了。其他人怎么看?

【问题讨论】:

  • @Steve:呵呵。学术界对你这样做......从来没有注意到,并且将它斜体化......你显然也来自学术界。 :)
  • 恐怕不是 - 只是 70 年代扎实的传统英语学校教育。
  • 如果那是臭名昭著的“文法学校”,你赢了。在英语教育系统中,英语学校胜过一切。 :)

标签: c scanf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 引用的文字不正确。使用%*d 等格式读取(但未存储)的项目在返回值中不计入。 www.cplusplus.com 似乎不是获取有关 C 标准库的准确信息的好来源。如果您想要一个可以链接到的在线参考资料,POSIX 是权威的;对于具有 POSIX 扩展的标准 C 函数,它具有以“CX”块标记的扩展部分。见opengroup.org/onlinepubs/9699919799/functions/scanf.html
      猜你喜欢
      • 2015-02-27
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多