我有一个缓冲器,我不希望用户输入更多的字符比缓冲区可容纳(以避免缓冲区溢出)。

我使用scanf并像这样完成的:

char buffer[30] = {'\0'};
scanf("%30s", buffer);

但是,我知道如果用户输入超过30。然而,如果用户输入超过30我保护,将所述缓冲液空终止?

有帮助吗?

解决方案

scanf()用“%S”转换说明增加了一个终止空字符到缓冲区。

但是,你问30个字符,这实际上意味着31只具有空间30.您应该使用的29最大字段宽度。

char buffer[30] = {'\0'};
scanf("%29s", buffer);

另外请注意,在转换说明"%c"作品很像"%s",但不添加终止空字符,并且不从输入丢弃的空间。根据你所期望的,它可能比使用“%s的”更好。

char buffer[30] = {'\0'};
scanf("%29c", buffer);
buffer[29] = '\0';

其他提示

scanf手册:

  

<强>取值匹配一个的序列   非空白字符;下一个   指针              必须为char指针,并且该阵列必须足够大,以              接受所有的序列和终止NULL字符。该              输入字符串停止在空白空间或在最大场宽度,              无论哪个先发生。

您正在调用UB。尝试:

#define str(x) #x
#define xstr(s) str(x)
#define BUFSIZE 30

char buffer[ BUFSIZE + 1 ];
scanf("%" xstr(BUFSIZE) "s", buf);

要忽略任何超出BUFSIZE字符抑制赋值:

scanf("%" xstr(BUFSIZE) "s%*", buf);

您也应该检查用户输入符/换行符和终止scanf如果他有:

scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);

和它是很好的做法来检查返回值,所以:

int rc = scanf("%" xstr(BUFSIZE) "[^\n]s%[^\n]*", buf);

和最后,检查是否有什么左(如换行,并使用它):

if (!feof(stdin))
    getchar();

您将有一个缓冲区溢出,因为你还没有允许终止NULL字符。声明您缓冲器是这样的:

char buffer[31];

和你将被罚款。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top