使用scanf()读取的字符串大小不超过

MrH*_*hma 31 c string scanf format-specifiers

编辑:对于我的班级,我必须使用scanf.所以推荐其他输入方式不是我正在寻找的解决方案(如果有一个涉及scanf).


如果我正在读取小项目的用户输入(例如,游戏).让我们说我会问would you like to play? 这会接受yesno回答.所以我写了一些像这样的简单代码:

#include <stdio.h>

int main(void)
{
     char string[3]; //The max number of letters for "yes".

     printf("Would you like to play?");
     scanf("%s", string);
}
Run Code Online (Sandbox Code Playgroud)

所以这段代码应该简单地要求他们输入yesno.我正在设定我char array的大小3.这样它足够大yes,也可以no.但是如果有人要输入无效的输入,比如yesss,我知道如何比较字符串以后处理这样的事件,但是这不会在技术上/可能覆盖我声明的其他局部变量,因为它会扩展到我的数组长度之外?如果是这样,有没有办法处理这个限制3个输入字符或什么?如果没有,为什么/如何知道只输入3的大小?

*注意:我是C的新手,我找不到这个,所以即使这很简单,我也很感激.因为我显然缺少一些东西.我来自java背景,这甚至都不是问题.

Dan*_*her 35

您的阵列需要能够容纳4 char秒,因为它还必须包含0终止符.修复后,指定格式的最大长度,

scanf("%3s", string);
Run Code Online (Sandbox Code Playgroud)

确保scanf读取不超过3个字符.

  • “确保 scanf 读取的字符不超过 3 个。” --&gt; 不完全是。`"%3s"` 将首先读取无限数量的前导空白字符。然后它将读取并保存最多 3 个非空白字符。最后附加一个_空字符_。 (3认同)
  • 我只想知道这是一件非常棒的事情,那么为什么人们一直说 scanf 不安全,显然他们可以这样做来限制输入并阻止缓冲区溢出漏洞利用。?? (2认同)
  • @SurajJain人们通常建议不要使用scanf,这不是因为它不能安全使用,而是因为它很难使用。当人们第一次学习C时,通过学习解析输入字符串比花时间学习scanf格式语言的缺点会更好。在生产代码中很少使用scanf;在绝大多数地方,C可能是错误的语言。 (2认同)

小智 10

最安全的方法是使用

与fgets(字符串,如图4所示,标准输入);

在这里,您可以存储最多3个字符,包括为NULL('\ 0')字符保留的一个空格.

  • fgets() 读取任何字符(包括空格)直到 EOF 或 \n。因此它不是 scanf() 的替代品,后者负责读取字符串的格式。 (2认同)

gsa*_*ras 9

您应该使用宽度修饰符scanf()并将其设置为比字符串的大小1,以确保为NULL终止符留出空间。

所以,如果你想存储“是”,你首先需要一个比你拥有的更大的数组;一个大小为 4、3 个字符加 1 的空终止符。此外,您应该指示scanf()读取不超过size - 1 个字符,其中 size 是数组的长度,在这种情况下为 3,如下所示:

#include <stdio.h>

int main(void)
{
     char string[4];
     scanf("%3s", string);
}
Run Code Online (Sandbox Code Playgroud)

  • @YashorajAgarwal 像这样 /sf/ask/1778748331/ (2认同)