web-dev-qa-db-ja.com

scanf()で文字列のサイズ以下を読み取ります

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


小さなプロジェクト(たとえば、ゲーム)のユーザー入力を読んでいる場合。 would you like to play?を尋ねるとしましょう。これはyesまたはnoの回答を受け入れます。そこで、次のような簡単なコードを作成します。

#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の場合にのみ入力することがなぜ/どのようにわかるのですか?

*注意:私はCに不慣れであり、これについてはあまり見つけることができなかったので、たとえこれが単純であっても感謝しています。明らかに何かが欠けているからです。私はJavaバックグラウンドから来ていますが、これは問題にならないでしょう。

26
MrHappyAsthma

配列には4つのcharを保持できる必要があります。0ターミネータも含まれている必要があるためです。それを修正し、形式で最大長を指定して、

scanf("%3s", string);

scanfが3文字を超えないようにします。

34
Daniel Fischer

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

fgets(string、4、stdin);

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

10
Timothy Malche

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

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

%[*][width][modifiers]type
4
anonymous

widthscanf() 修飾子を使用して、文字列のサイズより1つ小さい。これにより、NULLターミネータ用のスペースが確保されます。

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

#include <stdio.h>

int main(void)
{
     char string[4];
     scanf("%3s", string);
}
4
gsamaras