【问题标题】:Where to use this while loop?在哪里使用这个while循环?
【发布时间】:2015-12-22 03:42:09
【问题描述】:

我刚刚开始学习 c 编程。我不知道这个问题是否愚蠢。 我在哪里使用

while(getchar()! ='\n') ;

当在某些程序中使用 scanf 函数时,会使用上面提到的 while 循环,而其他一些程序在 scanf 函数之后不使用 while 循环。

那么,我应该在哪里使用这个 while 循环,而在哪里不应该呢?

【问题讨论】:

  • 简单地说你不应该使用这个,除非有特殊要求。
  • 那么,那个循环有什么作用?如果您知道它的作用,您应该能够推断何时使用它来自己回答这个问题或更好地陈述您的问题(“我知道……但不明白……”)。如果您不知道它的作用,那么您需要先弄清楚这一点,从实验开始,然后提出相关问题。
  • @VedantTerkar :特殊要求是正是问题是关于什么的。你的观点可以适用于任何代码——你不应该使用任何不做你需要做的事情的代码——这是陈词滥调。

标签: c while-loop getchar


【解决方案1】:

出错后使用循环清理一行的其余部分

当您(尝试)从标准输入读取一些数据但操作失败后,您认为输入行上留下了碎片时,您使用类似于问题中的循环的代码。

例如,如果您有:

int n;

if (scanf("%d", &n) != 1)
    …recover from error here?…

错误恢复应该检查 EOF(在这里使用 feof() 是正确的 - 但请参阅 while (!feof(file)) is always wrong 了解如何不使用 feof()),如果你没有得到 EOF,那么你可能得到了字母或标点字符而不是数字,循环可能是合适的。

请注意,您应始终检查scanf() 操作(或任何其他输入操作)是否成功,正确检查scanf() 系列函数是为了确保您获得预期的成功转换次数。检查scanf()是否返回EOF不正确;当输入队列中有一个字母并且您要求一个数字时,您可以返回 0。

当心 EOF

顺便提一下,问题中的循环并不安全。应该是:

int c;
while ((c = getchar()) != EOF && c != '\n')
    ;

如果问题中的循环获得 EOF,它会继续获得 EOF,并且不会做任何有用的事情。永远记得处理它。还要注意int c; 的使用——getchar() 返回一个int 而不是char,尽管它的名字。它必须返回一个int,因为它返回每个有效的字符代码并且还返回一个不同的值 EOF,你不能将 257 个值放入一个 8 位的数量中。

【讨论】:

    【解决方案2】:

    while循环语法:

    while (condition test)
    {
          // C- statements, which requires repetition.
          // Increment (++) or Decrement (--) Operation.
    }
    

    while(getchar()!='\n') ;

    这里你的条件是 getchar()!='\n'。

    首先getchar() 将执行。它将询问用户的输入。此函数将读取的字符作为无符号字符强制转换为文件结尾或错误时的 int 或 EOF。 While循环继续执行,直到返回值与'\n'不匹配

    scanf() 示例:scanf("%s", &str1);

    使用scanf,您只能要求用户输入一次输入对于多个输入,您必须将scanf置于循环中。

    当您要求在 while 循环条件下向用户输入输入时,它会一直询问用户的输入,直到 EOF 信号出现。

    【讨论】:

      【解决方案3】:

      scanf() 格式字符串不会导致它从输入缓冲区读取换行符时。

      大多数简单的格式说明符不会读取换行符。但是如果你使用%c,任何字符都可能被读取,包括换行符,在这种情况下循环需要修改:

      while( ch != '\n' && getchar() != '\n' ) ;
      

      其中ch 是接收%c 输入的变量。

      因为控制台输入通常是行缓冲的,未能使用换行符将导致后续的标准输入读取函数立即返回,而无需等待进一步的输入,这很少是预期的。

      如果在一行中输入多个字段但在单独的scanf()(或其他标准输入函数)调用中处理,则不会使用这样的循环。

      【讨论】: