【问题标题】:Unexpected input when using getchar(), and unexpected output using putchar()使用 getchar() 时出现意外输入,使用 putchar() 时出现意外输出
【发布时间】:2021-09-28 16:46:57
【问题描述】:

我是 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

【问题讨论】:

  • 在字符之前打印的数字(因为你使用了%d)是它的ASCII valuegetchar() 函数返回一个字符 (char)。所以它应该存储在 char 类型的变量中,而不是 int 中。

标签: c char newline getchar putchar


【解决方案1】:

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

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'

【讨论】:

  • @Newbie 您将其标记为有效答案。这很好,但也许也可以“提高”答案,说它是“好”。对其他人来说,如果您认为此评论是垃圾邮件,请见谅,但我认为该答案值得高分。
  • 我会,但我还没有足够的声誉
【解决方案2】:

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

【讨论】:

  • 哦,好吧,这解释了随机数的第一部分,正如我所料,以及关于 10 是解释所有数字的输入键的评论
【解决方案3】:

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

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

【讨论】:

  • ...或使用调试器单步执行您的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2021-02-07
  • 2018-02-02
  • 2017-04-26
  • 2020-09-22
相关资源
最近更新 更多