【问题标题】:try to understand for loops and getchar() in c尝试理解 c 中的 for 循环和 getchar()
【发布时间】:2015-10-29 20:42:07
【问题描述】:

我是 C 新手,我正在尝试了解 for 循环的工作原理。

我的代码是这样的

#include <stdio.h>
int main ()
{
   int a;
   for( a = 0; a < 4; a++ )
   {
      printf("value of a: %d\n", a);
   }

   return(0);
}

我得到了我的预期输出,它是 a 值的 4 倍,但是当我这样做时

#include <stdio.h>
int main ()
{
   char c;
   int a;
   for( a = 0; a < 4; a++ )
   {
      printf("value of a: %d\n", a);
      printf("Enter character: ");
      c = getchar();
      printf("Character entered: ");
      putchar(c);
      printf("\n");
   }
   return(0);
}

我明白了

a 的值:0 输入字符:m 输入的字符:m a 的值:1 输入字符:输入的字符:

a 的值:2 输入字符:a 输入的字符:a 的值:3 输入字符:输入的字符:

它以某种方式超过了getChar() 中的两个,为什么?

解决方案 感谢 cmets,让它开始工作:

int i;       
for( a = 0; a < 4; a++ )
{
    printf("Enter character: ");
    c = getchar();
    while ((i = getchar()) != '\n' && i != EOF)
    printf("Character entered: ");
    putchar(c);      
}

【问题讨论】:

  • getchar 之后的行中使用\n。清除它..while(getchar() != '\n'); 就足够了。
  • char c; 应该是 int c 因为返回的 getchar 是 int
  • while (getchar() != '\n') ... 如果stdin 恰好是一个文件或遇到错误,则很好的无限循环。
  • 假设我这样运行您的程序:foo &lt; input.dat 并假设 input.dat 为空。 getchar 会做什么?它将返回EOF,表示发生错误或文件结束。好吧,由于EOF\n 不匹配,循环将无限继续。
  • 测试getchar的返回值EOF,如果遇到就跳出循环。像这样的东西:while ((i = getchar()) != '\n' &amp;&amp; i != EOF)。请注意,i 必须是 int 而不是 char

标签: c for-loop getchar


【解决方案1】:

正如 cmets 中所指出的,ENTER 键的结果是换行符 (\n),getchar 在每个字母之后读取并返回它。 您还应该注意错误或文件结束条件。

这是一个更强大的版本:

#include <stdio.h>
int main ()
{
   char c;
   int a;
   for(a=0; a<4; a++)
   {
      printf("value of a: %d\n", a);
      printf("Enter character: ");
      do {
          c = getchar();
      } while(c == '\n'); // ignore newlines
      if(c == EOF) break; // end of input or error
      printf("Character entered: %c\n",c);
   }
   return(0);
}

这有一个额外的好处(或没有)重复的 ENTER 键被忽略。此外,如果您在 ENTER 之前键入两个字符,则它们的读取方式与分别键入时相同。同样,这可能好或不好,取决于您想要发生的事情。但是你应该问问自己你想要发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多