【问题标题】:printf prints additional * character [duplicate]printf 打印附加 * 字符 [重复]
【发布时间】:2023-03-10 19:31:01
【问题描述】:

我有一个非常简单的代码将大写转换为小写:

#include <stdio.h>
int main()
{
char c;
int i=0;
for (i=0;i<10;i++){
    c=getchar();
    c=c-'A'+'a';
    printf("%c\n",c );
    }
return 0;
}

但是运行这个简单的代码总是在输出时我有一个额外的* 字符。它在* 后面打印字符。看看:

D
d
*
D
d
*
E
e
*

这是从哪里来的?

【问题讨论】:

  • 运行调试器,在每次迭代中检查c的值.....
  • 仅供参考,getchar() 返回int,应该相应地使用。
  • 您对此有何意见?

标签: c loops getchar


【解决方案1】:

在每个输入之后,由于按下了ENTER键,有一个newline存储在输入缓冲区中,并在下一次迭代中由getchar()读取。

newline (\n) 的 ASCII 值是 10(十进制),添加到 'a'-'A' 是 32(十进制),产生 42(十进制),打印 *

FWIW,getchar() 返回一个int。将getchar() 的返回值存储到char 变量中是一个非常糟糕的主意,因为如果getchar() 失败,则可能的返回值之一,例如EOF 将不适合@ 987654336@ 类型,导致对甚至调试尝试的进一步条件检查出现问题。改变

char c;

int c = 0;

【讨论】:

  • 那么如何解决这个问题呢?
  • @SuperCoolHandsomeGelBoy 使用虚拟'\'n 使用getchar... 或使用scanf 更改代码?多种方式
  • 这些东西之前已经回答过1000次了。有关stdin尾随换行符导致的神秘输入现象的问题,请参考wikiHow to read / parse input in C? The FAQ(如有遗漏,请随时改进)。对于与 EOF 是 int 相关的错误的问题,也有无数的重复项。
  • This 似乎是“EOF 实际上是 int”的好骗子。
猜你喜欢
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多