如何使用scanf输入字符数组?

3

我设置了一个大小为10的字符数组,并想要检查允许输入的实际大小。

我进行了测试

123456789; 1234567890; 123456789123456789

有趣的是,它们都通过了测试并得到了正确的输出,分别是

123456789; 1234567890; 123456789123456789

这让我很困惑,因为我认为最后两个是错误的输入。

这是有道理的,还是编译器不同造成的?

这是代码:

#include <stdio.h>
main()    
{    
char input[10];    
scanf("%s", input);    
printf(input);    
}  '  
2个回答

6
scanf()函数使用格式说明符%s扫描输入直到遇到空格。在你的情况下,你看到的是未定义行为。虽然现在你得到了一个预期的答案,但这并不总是保证的,可能会导致崩溃。你的数组可以容纳10个char,但你正在越界写入。建议使用fgets()等函数来防止缓冲区溢出。

只要输入足够长,就保证会导致崩溃。原因是随着输入的增加,单个字节被写入更高的内存地址。在今天的大多数机器上,堆栈向下增长。因此,您的缓冲区溢出将破坏main()上方的堆栈,并且当main()终止时,所有的事情都会发生。如果您有堆栈保护程序,它将检测到它;否则,您可能会创建一个段错误。但更糟糕的是,这是恶意软件攻击的首选路线。 - GermanNerd

0

您可以使用

scanf("%9s", input);    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接