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

Unexpected input when using getchar(), and unexpected output using 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

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

在您输入一个被该调用读取的字符后

c = getchar();

然后输入缓冲区还存储了由于按回车键而出现的换行符'\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 );
        ^

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

当您的程序的输出令人困惑时,将东西塞在一起时,它有助于将事情分解。试试这个程序:

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