首页 文章

Putchar和Getchar在C中

提问于
浏览
7

我正在阅读K&R的The C Programming Language,并对putchar和getchar感到困惑 . 我制作了一个程序,你输入10个字符,程序将它们打印回屏幕 .

#include <stdio.h>

int main() 
{
    int i;
    int ch;
    for(i = 0; i < 10; i++)
    {
        printf("Enter a single character >> ");
        ch = getchar();
        putchar(ch);
    }

    return 0;
}

我希望得到这样的输出:

Enter a single character >> a
a
Enter a single character >> b
b

...等等10次,但这是我得到的输出:(进入2个字符后我停止了)

Enter a single character >> a
aEnter a single character >>
Enter a single character >> b
bEnter a single character >>
Enter a single character >>

不确定为什么我的输入字符与固定字符串组合并被输出 .

另外,我不太清楚为什么使用int来存储字符 .

6 回答

  • 3
    putchar(ch);
    

    只打印单个字符,以下 printf 在同一行内继续 . 只需添加:

    putchar('\n');
    

    putchar(ch); 之后,它将在 printf 执行之前显式启动新行 . 此外,您还应该从输入字符后的输入中获取 '\n'

    for(i = 0; i < 10; i++)
    {
        printf("Enter a single character >> ");
        ch = getchar();
        getchar();        // <-- "eat" new-line character
        putchar(ch);
        putchar('\n');    // <-- start new line
    }
    
  • 5

    您没有打印新行 . 在 putchar(ch); 之后,您应该使用 putchar('\n'); 来打印新行 .

  • 4

    用户终端可以在规范和非规范模式下操作 . 默认情况下,它以规范模式运行,这意味着标准输入可逐行(不是符号逐行)地用于程序 . 有问题的用户输入一些东西(让它是字母'a',十六进制为0x61)并按下输入(换行符中的新行字符'0x0A') . Ascii表是here . 因此,此操作为程序提供了两个符号 . 正如man getchar()中提到的那样,逐个符号地读取它 . 因此循环对一个字符迭代两次 . 要查看发生了什么,请使用以下程序(循环计数器输出,字符代码输出):

    #include <stdio.h>
    #include <unistd.h>
    
    int main() 
    {
      int i;
      char ch;
      for(i = 0; i < 10; i++)
      {
        printf("Enter a single character %d >>", i);
        ch = getchar();
        printf("Ch=0x%08X\n", ch);
        /*putchar(ch);*/
      }
    
      return 0;
    }
    

    输出:

    ┌─(02:01:16)─(michael@lorry)─(~/tmp/getchar)
    └─► gcc -o main main.c; ./main 
    Enter a single character 0 >>a
    Ch=0x00000061
    Enter a single character 1 >>Ch=0x0000000A
    Enter a single character 2 >>b
    Ch=0x00000062
    Enter a single character 3 >>Ch=0x0000000A
    Enter a single character 4 >>^C
    

    所以程序得到两个符号并打印出来 . 并且新的线符号不可见 . 所以在问题用户看到一个奇怪的额外线 . 有关不同终端模式以及如何进行调整的详细说明,请参见here .

    使用终端选项时stty实用程序也很有用("icanon"告诉终端是否使用规范模式) .

    关于在getchar()输出中将字符存储为int - 请参阅我的answer以获取类似主题 .

  • 0

    循环在偶数个时间, getchar() 没有从键盘输入,但是它取自之前输入的命中,所以你也会注意到循环只执行了5次 . 因此,您必须清除缓冲区,即按下输入,以便可以在 ch 中输入新字符 .

    for (i = 0; i < 5; i++)
        {
            printf("\nEnter a single character >> "); // new line
            ch = getchar();
            while (getchar() != '\n'); //Clearung buffer.
            putchar(ch);
        }
    
  • 0

    不确定是否理想,但这有效:

    #include <stdio.h>
        int main() 
        {
           int i;
           int ch;
            for(i = 0; i < 10; i++)
            {
                printf("Enter a single character >> ");
                getchar();
                ch=getchar();
                putchar(ch);
             }
    
             return 0;
           }
    
  • 0

    我是初学者 . 我尝试了这个版本的代码,它给出了所需的输出 .

    #include <stdio.h>
    
    int main()
    {
        int i;
        int ch;
        for(i = 0; i < 10; i++)
        {
            printf("Enter a single character >> ");
            fflush(stdin);
            ch = getchar();
            putchar(ch);
            printf("\n");
        }
    
        return 0;
    }
    

相关问题