如何限制scanf函数在C打印错误,当输入太长?(How to limit scanf functi

2019-06-25 04:31发布

我想限制scanf函数,所以当我例如输入一个char* array <String...>有超过30个字符,它不会得到它,我的输出将是错误。

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

任何帮助将是巨大的。

Answer 1:

如果你必须使用scanf话,我相信你能做的最好的是使用宽度指定的东西,如: "%31s" ,因为你已经提到的,那么使用strlen检查输入的长度,并丢弃字符串,如果输入的是比你的极限再报告错误。

或可能跳过strlen通过额外使用%n在您的格式字符串,如"%31s%n"

使用类似的格式字符串%[^\n]代替%s简单指示功能继续读书,直到一个换行符,消费沿途其他空白字符。 如果你想允许输入包含空格字符,这非常有用。

查看文档的scanf函数( 这里的手册页的复印件)。



Answer 2:

你可以使用fgetssscanf 。 随着fgets你可以读一点点超过30个字符,然后检查你没有得到超过30个字符。

或者,如果你真的想用scanf的东西超过使用30喜欢%32s



Answer 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);

由前述参数格式化字符的数量被存储在变量的偏移量



Answer 4:

你可以在一个循环中使用的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();
   }

这是一个粗的例子。 如果是对我,我会分配一个最大尺寸的字符数组,读整行的,然后用字符串工具来算它,编辑,等等。



Answer 5:

那么用C你可以这样做:

#include <string.h>

...

if(strlen(array_ptr) > 0) error();

很显然,你需要一个更大的缓冲实际上首先获得输入,然后检查它的长度,所以阵列可能是如512个字节。 当您复制字符串到它,你需要检查你在年底得到0。



Answer 6:

sscanf ,是这种事情很好,但仔细scanf可以在这里做的伎俩了。 你要确保你正确地限制字符用户可以输入的数量,所以31S%将意味着30个字符MAX +的\0空结束(31)。

什么你是防止缓冲区溢出攻击,它可以打破草率写C程序非常有效的方法。 这里有BO的优秀文章通过阿列夫一: http://insecure.org/stf/smashstack.html



文章来源: How to limit scanf function in C to print error when input is too long?