gpt4 book ai didi

c - 使用 Scanf 出现问题?

转载 作者:行者123 更新时间:2023-12-04 00:11:04 24 4
gpt4 key购买 nike

为什么scanf在“int”的情况下给出最大值,但在“char”的情况下超过限制时程序崩溃?

#include<stdio.h>
main(){
int a;
char ch[10];
scanf("%d",&a);
printf("%d",a);
scanf("%s",ch);
printf("%s",ch);
}

最佳答案

在这种情况下它会使你的程序崩溃,因为 scanf() 有一个 inherently 不安全的字符串接口(interface)。它无法知道您的参数 ch 是一个大到足以容纳 9 个字符的字符串加上它的终止 nul 的数组。因此,继续从 stdin 读取字符并将它们存储在数组末尾之后的内存中是非常高兴的。

如果你的程序崩溃了,你真的很幸运。在最坏的情况下,攻击者使用精心设计的字符串来操纵堆栈的内容,从而控制您的计算机。这是缓冲区溢出攻击的一个示例。这听起来不太可能,但据记录它在很多场合都会发生。

只用于数字,scanf一般来说足够安全,但它不太擅长处理输入中的错误。因此,通常最好使用 fgets() 之类的东西来读取输入(它有一个缓冲区长度参数来控制溢出)和 sscanf()从该缓冲区中解析,随时测试其返回值是否合理。

编辑: 来自 R 的评论指出,我夸大了 scanf 接口(interface)固有的危险。小心在所有字符串上正确使用字段宽度说明符,scanf 变得更安全。但是你负责保证指定的宽度确实适合缓冲区。例如,您应该编写 scanf("%9s",ch); 因为您的缓冲区被声明为十字节长,并且您需要为终止的 nul 留出空间。

请注意,您还应该测试 scanf() 的返回值。它返回成功匹配的字段数,如果发生 I/O 错误,则返回 EOF。例如,如果用户在期望数字时输入“abc”,它可能会返回 0。

关于c - 使用 Scanf 出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3456106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com