46

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

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

4

4 回答 4

59

您的数组需要能够容纳四个chars,因为它还必须包含 0 终止符。在固定的情况下,在格式中指定最大长度,

scanf("%3s", string);

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

于 2012-09-06T18:56:25.490 回答
18

最安全的方法是使用

fgets(string, 4, stdin);

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

于 2012-10-16T06:27:28.813 回答
9

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

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

#include <stdio.h>

int main(void)
{
     char string[4];
     scanf("%3s", string);
}
于 2017-06-20T21:09:22.400 回答
5

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

使用“宽度”修饰符;

%[*][width][modifiers]type
于 2012-09-06T19:00:49.157 回答