题
我有一个缓冲器,我不希望用户输入更多的字符比缓冲区可容纳(以避免缓冲区溢出)。
我使用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];
和你将被罚款。
不隶属于 StackOverflow