【问题标题】:Why does this C code always output a smiley face?为什么这段 C 代码总是输出笑脸?
【发布时间】:2023-03-28 06:35:01
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
//A simple program that asks for the user's name and prints it back out.
int main()
{
    char name[15]; 
    printf("What is your name? ");
    scanf("%c",&name);
    printf("Name: %c",name);
}

无论输入是什么,笑脸总是输出。我意识到如果我将 %c 更改为 %s,程序会运行得很好,但我想知道为什么输出是笑脸。 此外,如果第二个 %c 被替换为 %s 即

char name[15]; 
printf("What is your name? ");
scanf("%c",&name);
printf("Name: %s",name);

然后在输入的第一个字符之后打印一个@符号。例如,如果输入是“Sam”,那么输出将是“S@”。关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 它并不总是输出那个。我认为不会。
  • 可能是因为“name”的内存地址的低位字节恰好是系统中笑脸的字符值。纯属巧合。
  • 总是,总是检查任何scanf 系列函数的返回,尤其是在接受用户输入时。

标签: c


【解决方案1】:

这是未定义的行为,请尝试

scanf("%14s", name);

您将错误的参数传递给“%c”说明符,该说明符需要一个指向单个char 的指针。相反,您需要 "%s" 说明符,并且由于 name 是一个数组,它会自动成为指向其第一个元素的指针,因此您不需要运算符的 &amp; 地址。

【讨论】:

  • 您使用了错误的格式说明符,即您没有得到输出。使用 %s 而不是 %c。因为 %c 只接受一个字符,而 %s 将输入作为字符串。还有不要使用&。因为数组名表示为基地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2022-07-11
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多