【问题标题】:How to use scanf for a char array input?如何将 scanf 用于 char 数组输入?
【发布时间】:2015-04-06 14:50:09
【问题描述】:

我设置了一个大小为 10 的 char 数组,并希望检查允许的输入的实际大小。

我测试过

123456789; 1234567890; 123456789123456789

有趣的是,所有这些都通过并得到了正确的输出

123456789; 1234567890; 123456789123456789

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

这有意义还是编译器的差异?

这是代码

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

【问题讨论】:

    标签: c arrays scanf


    【解决方案1】:

    带有格式说明符%sscanf() 会扫描输入,直到遇到空格。在您的情况下,您看到的是未定义的行为。 您的数组可以容纳 10 个chars,但您正在写出它的边界。

    虽然您现在得到了预期的答案,但这并不总是得到保证,反而可能会导致崩溃。

    建议使用fgets() 之类的函数来处理缓冲区溢出。

    【讨论】:

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

    你可以使用

    scanf("%9s", input);    
    

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 2016-09-07
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2019-04-02
      相关资源
      最近更新 更多