【问题标题】:why does getchar in while not execute after first iteration? [duplicate]为什么 getchar 在第一次迭代后不执行? [复制]
【发布时间】:2013-10-13 06:11:18
【问题描述】:

我编写了一个程序来逐个字符地读取输入并将其打印到输出,这是我的代码:

#include <stdio.h>

main()
{

    int c;
    while((c = getchar()) != EOF)
    {
        printf("%s\n", "log1");
        printf("%c\n", c);
        printf("%s\n", "log2");
    }

}

结果如下:

a(my input)
log1
a
log2
log1


log2

但它应该有这样的结果:

a
log1
a
log2

这个程序有什么问题?

【问题讨论】:

  • 在点击“发布您的问题”按钮之前,您是否尝试在 SO 上查找数百个相关答案?
  • 你确定吗,除了字符“a”,你没有输入任何其他内容?
  • 猜你在被告知不要这样做之前输入了。坏孩子

标签: c


【解决方案1】:

你输入一个和换行符

a(my input)  You are giving a and newline

//this is because of a 
log1
a
log2 

//this is because of newline
log1


log2

检查换行符并避免打印换行符。

    while((c = getchar()) != EOF)
        {
            if(c!='\n')
               {  
                printf("%s\n", "log1");
                printf("%c\n", c);
                printf("%s\n", "log2");
               }
        }

【讨论】:

    【解决方案2】:

    这是因为您while((c = getchar()) != EOF) 在到达 EOF 后结束。这是因为当您输入内容并按下回车键时,所有内容都存储在内部缓冲区中。

    getchar 在该缓冲区中找不到任何内容时,您的代码将停止。

    你也可以看看这个:- Where does getchar() store the user input?

    【讨论】:

    • 输入一些内容后尝试按 Ctrl + D。
    【解决方案3】:

    getchar 在第二次迭代期间运行。问题是您的输入实际上是“a[enter]”,所以getchar 读取的第二个字符是换行符,它会打印出来。

    如果你输入“abc”,事情可能会更清楚。

    【讨论】:

      【解决方案4】:

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

      请记住,while 循环中的表达式每次都会执行 - 因此即使找到字符 '\n',它也已被 getchar() 调用从流中删除。

      【讨论】:

        【解决方案5】:

        设置不打印\n的条件(按Enter

          while((c = getchar()) != EOF)
                {
                    if(c != '\n') 
                    printf("%s\n", "log1");
                    printf("%c\n", c);
                    printf("%s\n", "log2");
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-14
          • 1970-01-01
          • 2011-10-22
          • 2016-08-18
          • 2019-12-04
          • 1970-01-01
          相关资源
          最近更新 更多