我想限制 scanf 函数,因此当我输入例如char* array <String...>
超过 30 个字符的 a 时,它不会得到它并且我的输出将是错误的。
我得到了使用 [^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);
由前面的参数格式化的字符数存储在变量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 个字符 +\0
空终止符 (31)。
您要防止的是缓冲区溢出攻击,这可能是破坏草率编写的 c 程序的极其有效的方法。这是 Aleph One 在 BO 上的一篇优秀文章:http: //insecure.org/stf/smashstack.html