繁体   English   中英

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;
}

输入“名称”和“是”,预期的 output 是它说:

你好! 姓名

你说:是的

相反,我得到:

你好! es

你说:是的

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

那么我到底错过了什么?

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

您只为一个字符是/否的答案分配了空间,但正在向其中写入更多字符。

这会导致未定义的行为

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

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

我想提供这个答案基本上是说:永远不要使用 sscanf 或任何过时的、不安全的 C 函数。 即使这可能只是一个玩具示例,也请练习编写现代 C 代码。 从长远来看,您将从中受益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM