我想限制scanf函数,所以当我例如输入一个char* array <String...>
有超过30个字符,它不会得到它,我的输出将是错误。
我有一个提示使用[^ n]或类似的东西,但我不知道该怎么办呢? 我知道,我可以使用scanf("%30s"..)
但我不希望输入是有效的,只是错误。
任何帮助将是巨大的。
我想限制scanf函数,所以当我例如输入一个char* array <String...>
有超过30个字符,它不会得到它,我的输出将是错误。
我有一个提示使用[^ n]或类似的东西,但我不知道该怎么办呢? 我知道,我可以使用scanf("%30s"..)
但我不希望输入是有效的,只是错误。
任何帮助将是巨大的。
如果你必须使用scanf
话,我相信你能做的最好的是使用宽度指定的东西,如: "%31s"
,因为你已经提到的,那么使用strlen
检查输入的长度,并丢弃字符串,如果输入的是比你的极限再报告错误。
或可能跳过strlen
通过额外使用%n
在您的格式字符串,如"%31s%n"
。
使用类似的格式字符串%[^\n]
代替%s
简单指示功能继续读书,直到一个换行符,消费沿途其他空白字符。 如果你想允许输入包含空格字符,这非常有用。
查看文档的scanf函数( 这里的手册页的复印件)。
你可以使用fgets
和sscanf
。 随着fgets
你可以读一点点超过30
个字符,然后检查你没有得到超过30
个字符。
或者,如果你真的想用scanf
的东西超过使用30
喜欢%32s
。
看看这个页面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);
由前述参数格式化字符的数量被存储在变量的偏移量 。
你可以在一个循环中使用的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();
}
这是一个粗的例子。 如果是对我,我会分配一个最大尺寸的字符数组,读整行的,然后用字符串工具来算它,编辑,等等。
那么用C你可以这样做:
#include <string.h>
...
if(strlen(array_ptr) > 0) error();
很显然,你需要一个更大的缓冲实际上首先获得输入,然后检查它的长度,所以阵列可能是如512个字节。 当您复制字符串到它,你需要检查你在年底得到0。
sscanf
,是这种事情很好,但仔细scanf
可以在这里做的伎俩了。 你要确保你正确地限制字符用户可以输入的数量,所以31S%将意味着30个字符MAX +的\0
空结束(31)。
什么你是防止缓冲区溢出攻击,它可以打破草率写C程序非常有效的方法。 这里有BO的优秀文章通过阿列夫一: http://insecure.org/stf/smashstack.html