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

时间:2012-06-04 18:50:19

标签: c string input scanf

我想限制scanf功能,所以当我输入例如一个超过30个字符的char* array <String...>时,它就不会得到它而且我的输出会出错。

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

任何帮助都会很棒。

6 个答案:

答案 0 :(得分:6)

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

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

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

查看scanf的文档(here's手册页的副本)。

答案 1 :(得分:3)

您可以使用fgetssscanf。使用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