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

问题描述 投票:24回答:4

编辑:对于我的班级,我必须使用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);
}

所以这段代码应该简单地要求他们输入yesno。我将char array的长度设置为3。这样它足以容纳yesno。但是如果有人要输入无效的输入,例如yesss,我知道如何比较后面的字符串来处理这样的事件,但是这不会在技术上/可能覆盖我声明的其他局部变量,因为它会延伸到我的长度之外阵列?如果是这样,有没有办法处理这个限制3个输入字符或什么?如果没有,为什么/如何知道只输入3的大小?

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

c string scanf format-specifiers
4个回答
29
投票

你的数组需要能够容纳四个chars,因为它还必须包含0-terminator。修复后,指定格式的最大长度,

scanf("%3s", string);

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


9
投票

最安全的方法是使用

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

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


4
投票

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

使用“宽度”修饰符;

%[*][width][modifiers]type

3
投票

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

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

#include <stdio.h>

int main(void)
{
     char string[4];
     scanf("%3s", string);
}
© www.soinside.com 2019 - 2024. All rights reserved.