我想限制scanf功能,所以当我输入例如一个超过30个字符的char* array <String...>
时,它就不会得到它而且我的输出会出错。
我得到了一个暗示使用[^ n]或类似的东西,但我不明白该怎么做?
我知道我可以使用scanf("%30s"..)
但我不希望输入有效而只是错误。
任何帮助都会很棒。
答案 0 :(得分:6)
如果您必须使用scanf
,那么我相信您可以做的最好的就是使用宽度说明符,例如:"%31s"
,如您所述,然后使用{{1} }检查输入的长度,如果输入超过限制,则丢弃字符串并报告错误。
或者可以通过在格式字符串中另外使用strlen
来跳过strlen
,例如%n
。
使用"%31s%n"
之类的格式字符串代替%[^\n]
只是指示函数继续读取直到换行符,沿途消耗其他空白字符。如果要允许输入包含空格字符,这非常有用。
查看scanf的文档(here's手册页的副本)。
答案 1 :(得分:3)
您可以使用fgets
和sscanf
。使用fgets
,您可以阅读多于30
个字符,然后检查您的字符数不会超过30
。
或者,如果您真的想使用scanf
,请使用30
之外的%32s
以上的内容。
答案 2 :(得分:3)
查看此页面http://linux.die.net/man/3/sscanf并查找%n 格式说明符。我还建议查看sscanf函数的返回值,它将告诉您格式化参数的数量,以及是否存在错误。
我使用%n 格式说明符来帮助解析一串参数:
ret = sscanf(line, "%d %d %s %d %d %n", &iLoad, &iScreen, &filename, &stage, &bitmapType, &offset);
前面参数格式化的字符数存储在变量 offset 中。
答案 3 :(得分:2)
你可以在循环中使用getchar,并计算进来的字符。
int iCharCount = 0;
ch = getchar();
while( ch != EOF ) {
iCharCount++;
if(30 < iCharCount)
{
printf("You have attempted to enter more than 30 characters.\n");
printf("Aborting.");
break;
}
printf( "%c", ch );
ch = getchar();
}
这是一个粗略的例子。如果由我决定,我会分配一个最大大小的字符数组,读取整行,然后使用字符串实用程序对其进行计数,编辑它,等等。
答案 4 :(得分:1)
在C中你可以做到:
#include <string.h>
...
if(strlen(array_ptr) > 0) error();
显然你需要一个更大的缓冲区来实际首先得到它的输入,然后检查它的长度,所以数组可以是例如512字节。将字符串复制到其中时,需要检查最后是否为0。
答案 5 :(得分:0)
sscanf
,对于这种事情非常有用,但是小心scanf
也可以在这里做到。您需要确保正确限制用户可以输入的字符数,因此%31s表示最多30个字符+ \0
空终止符(31)。
你正在阻止的是缓冲区溢出攻击,这可能是打破粗略编写的c程序的极其有效的方法。这是Aleph One在BO上的精彩文章: http://insecure.org/stf/smashstack.html