46

編集:私のクラスでは、を使用する必要がありますscanf。したがって、他の入力方法を推奨することは、私が探している解決策ではありません(scanfを含むものがある場合)。


小さなプロジェクト(ゲームなど)のユーザー入力を読み込んでいる場合。私が尋ねるとしましょうこれはまたは答えwould you like to play? を受け入れるでしょう。だから私はこのようないくつかの簡単なコードを書きます:yesno

#include <stdio.h>

int main(void)
{
     char string[3]; //The max number of letters for "yes".

     printf("Would you like to play?");
     scanf("%s", string);
}

したがって、このコードは単にyesまたはを入力するように要求する必要がありますno。自分の長さchar arrayをサイズに設定しています3。このように、それは保持するのに十分な大きさでyesあり、またno。しかし、誰かがなどの無効な入力を入力しyesssた場合、後でそのようなイベントを処理するために文字列を比較する方法を知っていますが、配列の長さの範囲外に拡張されるため、宣言した他のローカル変数を技術的/おそらく上書きしません?もしそうなら、これを処理して3つの入力文字などを制限する方法はありますか?そうでない場合は、なぜ/どのようにして3のサイズのみを入力することがわかるのでしょうか。

4

4 に答える 4

59

char配列には0ターミネータも含まれている必要があるため、配列は4つのsを保持できる必要があります。これを修正して、フォーマットで最大長を指定すると、

scanf("%3s", string);

scanf読み取りが3文字以下であることを保証します。

于 2012-09-06T18:56:25.490 に答える
18

最も安全な方法は使用することです

fgets(string, 4, stdin);

NULLここでは、 ('\0')文字用に予約された1つのスペースを含めて最大3文字を格納できます。

于 2012-10-16T06:27:28.813 に答える
9

の幅修飾子を使用し、文字列のサイズより1つ小さいscanf()値に設定して、ターミネータ用のスペースが確保されるようにする必要があります。NULL

したがって、「yes」を格納する場合は、最初に、所有している配列よりも大きな配列が必要になります。1つはサイズ4、3文字に加えてヌルターミネータ用の1です。さらに、サイズは1scanf()文字以下にするように指示する必要があります。ここで、サイズは配列の長さであり、この場合は次のように3文字になります。

#include <stdio.h>

int main(void)
{
     char string[4];
     scanf("%3s", string);
}
于 2017-06-20T21:09:22.400 に答える
5

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

「幅」修飾子を使用します。

%[*][width][modifiers]type
于 2012-09-06T19:00:49.157 に答える