4

我想限制 scanf 函数,因此当我输入例如char* array <String...>超过 30 个字符的 a 时,它不会得到它并且我的输出将是错误的。

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

任何帮助都会很棒。

4

6 回答 6

8

如果您必须使用scanf,那么我相信您能做的最好的事情就是使用宽度说明符"%31s",如您已经提到的:,然后使用strlen检查输入的长度,并丢弃字符串并在以下情况下报告错误输入长于您的限制。

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

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

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

于 2012-06-04T19:08:28.100 回答
3

您可以使用fgetssscanf。您可以阅读比字符多fgets一点的内容30,然后检查您没有得到比30字符多一点的内容。

或者,如果您真的想将scanf它与30类似%32s.

于 2012-06-04T18:57:02.120 回答
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中。

于 2012-06-04T19:14:34.533 回答
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();
   }

这是一个粗略的例子。如果由我决定,我会分配一个最大大小的字符数组,读入整行,然后使用字符串实用程序对其进行计数、编辑等等。

于 2012-06-04T19:01:15.673 回答
1

那么在C中你可以这样做:

#include <string.h>

...

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

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

于 2012-06-04T18:56:41.453 回答
0

sscanf,对于这种事情非常好,但是小心scanf也可以在这里解决问题。您需要确保正确限制用户可以输入的字符数,因此 %31s 意味着最多 30 个字符 +\0空终止符 (31)。

您要防止的是缓冲区溢出攻击,这可能是破坏草率编写的 c 程序的极其有效的方法。这是 Aleph One 在 BO 上的一篇优秀文章:http: //insecure.org/stf/smashstack.html

于 2012-06-18T17:29:40.253 回答