4

scanf 関数を制限したいので、たとえばchar* array <String...>30 文字を超える a を入力すると、それが取得されず、出力がエラーになります。

[^n] とかの使い方のヒントはもらったけど、やり方がわからない?使用できることはわかっていますscanf("%30s"..)が、入力を有効にしてエラーだけにしたくありません。

どんな助けでも素晴らしいでしょう。

4

6 に答える 6

8

使用する必要scanfがある場合は、幅指定子を次のようなもので使用するのが最善だと思い"%31s"ます。すでに述べたように、を使用strlenして入力の長さを確認し、文字列を破棄してエラーを報告します。入力が制限より長くなっています。

または、フォーマット文字列でをstrlen追加して使用して、をスキップすることもできます。%n"%31s%n"

%[^\n]の代わりにのようなものを使用するフォーマット文字列%sは、改行まで読み取りを続行するように関数に指示し、途中で他の空白文字を消費します。これは、入力に空白文字を含めることができるようにする場合に役立ちます。

scanfのドキュメントを確認してください(これがmanページのコピーです)

于 2012-06-04T19:08:28.100 に答える
3

fgetsとを使用できますsscanf。を使用すると、文字数を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プログラムを破壊する非常に効果的な方法です。BOに関するAlephOneの優れた記事は次のとおりです。http: //insecure.org/stf/smashstack.html

于 2012-06-18T17:29:40.253 に答える