【问题标题】:Reading input from getchar从 getchar 读取输入
【发布时间】:2013-12-23 10:16:01
【问题描述】:
while(1)
{
    if(i == 6)
        break;
    temp[i] = getchar();
    putchar(temp[i]);
    i++;
}

每当我不得不以这种方式使用 getchar 时,它也接受 enter 作为输入之一,因此我只能输入三个字符而不是 6 个字符。为什么 getchar 将 enter 作为输入之一?如何避免这种情况?

输入:

1
2
3

在此循环中断后,因为按下的三个返回被视为 temp[1]、temp[3] 和 temp[5] 的三个输入。

【问题讨论】:

    标签: c++ c getchar getch putchar


    【解决方案1】:

    getchar 一次读取一个字符。在按下 Enter 键时,您将换行符 \n 传递给 C 标准缓冲区,getchar 在下次调用 getchar 时也会读取该缓冲区。为了避免这个\n 字符,你可以试试这个

    while(1)
    {
        if(i == 6)
            break;
        if((temp[i] = getchar()) != '\n')
        {
            putchar(temp[i]);
            i++;
        }
    }   
    

    另请阅读此answer 以了解getchar 的工作原理。

    【讨论】:

    • 啊,6 票?有没有人真正编译和运行代码?如果用户一次输入一个字符,循环也会在屏幕上打印 6 个字符时中断。
    • @hacks 是的,因为 WKplus 说它会在这之前中断,因为输入是每行一个字符
    • @WKPlus;承认这一点。现已编辑。
    【解决方案2】:

    检查空格字符,不要添加/计算它。 getchar() 返回您点击的所有字符,包括换行符和空格。

    while(i < 6)
    {
        temp[i] = getchar();
        if (isspace(temp[i]))
            continue;
    
        putchar(temp[i]);
        i++;
    }
    

    【讨论】:

      【解决方案3】:

      getcharstdin 缓冲区中一次读取一个字符。一旦您输入一个字符并按 Enter 键,那么在 stdin 缓冲区中将存储两个字符。

      如果您想使用您的代码输入六个字符,则一次输入所有字符,然后按 Enter 即可。否则你将不得不跳过“输入”字符。像这样……

      #include<stdio.h>
      int main()
      {
              int i=0;
              char temp[10];
              while(1)
              {
                      if(i == 6)
                              break;
                      temp[i] = getchar();
                      if(temp[i]!='\n')
                      {
                              putchar(temp[i]);
                              i++;
                      }
              }
      } 
      

      【讨论】:

        【解决方案4】:

        为什么getchar 将输入作为输入之一?

        字符输入函数一次从流中读取一个字符。调用时,这些函数中的每一个都返回流中的下一个字符,如果已到达文件末尾或发生错误,则返回 EOF。 一些字符输入函数被缓冲(例如:getchar())。这意味着操作系统将所有字符保存在一个临时存储空间中,直到我们按下 Enter ,然后系统将这些字符发送到stdin流。

        如何避免这种情况? 正如haccks建议的那样

        【讨论】:

          【解决方案5】:

          这个方法怎么样。你可以使用 getchar() 两次两次。 像这样,

          while(1)
          {
              if(i == 6)
                  break;
              temp[i] = getchar();
              getchar();
              putchar(temp[i]);
              i++;
          }
          

          【讨论】:

            猜你喜欢
            • 2011-01-31
            • 2019-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-05
            相关资源
            最近更新 更多