2017-02-23 8 views
0

標準入力から変数を受け入れたいが、ユーザーが2つまたは3つの変数を入力できるように受け入れる変数の数を定義したくない。標準入力からのユーザー入力を受け入れる変数入力の量が変わる可能性がある

例えば、私が持っているでしょう:

char key; 
char name1[100]; 
char name2[100]; 


printf("Hello! insert your command:\n"); 
scanf("%c %s %s",&key, name1, name2); 

が、入力「Fジョン」と「Lジョン・ドウ」「X」は、すべてが受け入れられるように、2番目の名前を挿入するために必要なユーザーイマイチ。基本的には、入力の長さをあらかじめ決めておきたいのではなく、1,2または3の変数を受け入れるだけです。 scanfはこれを行う適切な方法ですか、それとも良い方法がありますか?

現在、それはあなたが変数に文字列から入力文字列全体と、その後sscanf()を読むためにfgets()を使用することができます

答えて

1

を割り当てられるためにすべての3つの変数を待ちます。 sscanf()は、正常に読み取られたフィールドの数を返します。この番号を使用して、どの変数が初期化されているかを判断できます。

char buffer[100]; 
int n; 
printf("Hello! insert your command:\n"); 
fgets(buffer, sizeof(buffer), stdin); 
n = sscanf(buffer, "%c %s %s", &key, name1, name2); 
# 1, 2 or 3 

それはコメントで指摘したように、行の残りの部分は、あまりにも(100-1=99文字まで)、読み込まれます。私は、残りの部分に関心のある分野はもうないと仮定します。

+1

これは、文字と2つの*単語*(空白で区切られたトークン)を読むだけでなく、行の末尾これが望ましい場合は、99文字を超えて、次の '\ n 'まで捨てたいので、それ以上のコードが必要です)...それは望ましいかもしれません。望ましくないが、それにかかわらず、それは通常気付かれない微妙な違いである。 – Sebivor

+0

@Seb Correct。私は、3つまでの名前コンポーネントを除いて、他には何もないと仮定します。 – DyZ

1

scanfはこれを行う適切な方法ですか、それとも良い方法がありますか?

はい、scanfはこれに完全に適しています。しかし、フォーマット文字列で使用したスペースはではないことに注意する必要があります。 1つのスペースだけでなく、シーケンス0以上の空白文字(スペース、タブ、改行を含む)と一致するので、それらは異なる意味を持ちます。代わりに、%*1[^ ]ディレクティブを使用することをお勧めします。あなたは明確にするため#define SPACE_FORMAT "%*1[^ ]"としてこれを定義し、次のようにそれを使用することができます。

int n = scanf("%c" SPACE_FORMAT "%s" SPACE_FORMAT "%s", &key, name1, name2); 

注意慎重に私はnに戻り値を格納してきましたか。 scanfがうまくマッチし、に割り当てられている場合:(&keyによって指さ)

  • 最初のオブジェクトだけ、それだけで... 1最初の(&keyによって指さ)と第二(指さ
  • を返します〜によってname1)オブジェクト、それは2を返します...
  • ...など。読み取りエラーまたはEOFに達したためscanfが失敗した場合は、代わりにEOF(負の整数)が返されます。
関連する問題