scanf 和 printf 不打印正确的值

scanf and printf not printing right values

这是怎么回事? 代码如下:

#include<stdio.h>
#include<string.h>

int main()
{
    char name[15];
    char name_[15];
    char answ[1];

    printf("What's your name?\n");
    scanf("%s", name);

    strcpy(name_, name);

    printf("Yes / No: ");
    scanf("%s", answ);

    printf("Hello! %s\n", name_);
    printf("You said: %s\n", answ);

    return 0;
}

输入“name”和“yes”后,预期的输出是:

Hello! name

You said: yes

相反,我得到:

Hello! es

You said: yes

我也尝试在 %s 之前添加空格,但没有结果。

那么我到底错过了什么?

您只为一个 yes/no 个字符的答案分配了 space,但正在向其中写入更多字符。

这导致 undefined behaviour

您需要为 answ 分配更多 space,不要忘记 NUL 终止符。

answ 只能包含 1 个字符。所以目前,额外的字符 "es" + '[=12=]' 被写入分配给 name_ 的内存中。 因此,"es" 被打印出来。

您已经在 运行 但在您的代码中创建了一个经典的可利用缓冲区。这就是为什么大多数现代编译器会建议您将 sscanf 换成 sscanf_s 或类似的原因。正如其他人指出的那样,您覆盖了堆栈中的下一个变量。

我想提供这个答案基本上就是说:永远不要使用 sscanf 或任何过时的、不安全的 C 函数。即使这可能只是一个玩具示例,也可以练习编写现代 C 代码。您将在长期 运行.

中受益