使用 getchar() 时出现意外输入,使用 putchar() 时出现意外输出

问题描述

我是 c 的新手,对它的了解很少,但是据我所知,这段代码应该打印我输入的字符(它应该打印两次),或者打印我的字符的位数表示我的角色(在再次要求输入 100 次循环之前)但似乎两者都不做。

相反,它打印一些随机数(我假设表示为数字),然后是字母,然后是 10。

我正在使用 gcc 在 wsl 上运行的 ubuntu 18.04 上编译它,如果这有什么不同的话。我又一次是个新手,所以我不知道这是否是一个可能的错误点。

这是我的代码

#include <stdio.h>
int c;


 int main() {
    
 
    for(int x =0; x < 100; x++){
        c = getchar();
        printf("%d",c);
        putchar( c );

    }
}

示例:

输入:f

输出:102f10

输入:r

输出:114r10

解决方法

在你输入一个被这个调用读取的字符之后

c = getchar();

然后输入缓冲区还存储了由于按 Enter 键而出现的换行符 '\n'

因此在这个循环中

for(int x =0; x < 100; x++){
    c = getchar();
    printf("%d",c);
    putchar( c );

}

如果您输入例如字符 'f' 则此调用

    printf("%d",c);

输出其内部代码

102

之后的下一个调用

    putchar( c );

输出字符本身。

f

现在输入缓冲区包含换行符'\n'。并且在循环的下一次迭代中它的内部表示

10

由调用输出

    printf("%d",c);

代替电话

c = getchar();

使用

scanf( " %c",&c );
        ^

注意格式字符串中的空格。在这种情况下,将跳过空白字符,例如换行符 '\n'

,

那是因为您通过执行 printf("%d",c) 将 ASCII 表示打印为您输入的字符的整数。如果您希望将您输入的字符打印在控制台上仅作为字符,您应该删除 printf 并使用 putchar。

,

当您的程序的输出令人困惑,并且东西塞在一起时,最好将其分解。试试这个程序:

int main() {
    for(int x =0; x < 100; x++){
        c = getchar();
        printf("got character %c = %d\n",c,c);
    }
}