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

时间:2012-09-06 18:54:06

标签: 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);
}

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

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

4 个答案:

答案 0 :(得分:29)

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

scanf("%3s", string);

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

答案 1 :(得分:9)

最安全的方法是使用

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

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

答案 2 :(得分:4)

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

使用“width”修饰符;

%[*][width][modifiers]type

答案 3 :(得分:4)

您应该使用scanf() width 修饰符并将其设置为比字符串大小少,以确保存在空间对于NULL终结者。

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

#include <stdio.h>

int main(void)
{
     char string[4];
     scanf("%3s", string);
}