如何限制C中的scanf函数在输入太长时打印错误?

我想限制scanf函数,所以当我输入例如一个超过30个字符的char* array ,它将无法获取它并且我的输出将是错误的。

我有一个提示使用[^ n]或类似的东西,但我不明白该怎么做? 我知道我可以使用scanf("%30s"..)但我不希望输入有效,只是错误。

任何帮助都会很棒。

如果你必须使用scanf那么我相信你可以做的最好的是使用宽度说明符,如你所提到的那样: "%31s" ,然后使用strlen来检查输入的长度,并丢弃如果输入超过限制,则输入字符串并报告错误。

或者可以通过在格式字符串中另外使用%n来跳过strlen ,例如"%31s%n"

使用%[^\n]类的格式字符串代替%s只是指示函数继续读取直到换行符,沿途消耗其他空白字符。 如果要允许输入包含空格字符,这将非常有用。

查看scanf的文档( 这是手册页的副本)。

你可以使用fgetssscanf 。 使用fgets您可以读取超过30字符,然后检查您没有超过30字符。

或者,如果你真的想使用scanf使用超过30 %32s东西,比如%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  ... if(strlen(array_ptr) > 0) error(); 

显然你需要一个更大的缓冲区来实际首先得到它的输入,然后检查它的长度,所以数组可以是例如512字节。 将字符串复制到其中时,需要检查最后是否为0。

sscanf ,非常适合这种事情,但仔细scanf也可以在这里做到这一点。 您需要确保正确限制用户可以输入的字符数,因此%31s表示最多30个字符+ \0空终止符(31)。

你正在防止的是缓冲区溢出攻击,这可能是打破写得不好的c程序的极其有效的方法。 这是Aleph One在BO上的精彩文章: http : //insecure.org/stf/smashstack.html