1

重複の可能性:
scanfを使用してスペースを入力するにはどうすればよいですか?
scanf()を使用して、スペースを含む文字列をスキャンするにはどうすればよいですか?

Cは初めてで、これは非常に単純なはずだと思いますが、何らかの理由で明確な答えがわかりません。

名前とアドレスをファイルに書き込もうとしていますが、「FirstName LastName」を入力すると、FirstNameのみがファイルに入力されます。住所も同じです。ファイルにスペースを含む名前全体を受け入れる方法はありますか?

struct person{
     char name[20];
     char address[50];
     char telno[20];
} info;

fp=fopen("contacts","a")

printf("Enter Name : ");
scanf("%s",info.name);

printf("Enter Address : ");
scanf("%s",info.address);

fprintf(fp,"%20s %20s %20s",info.name,info.address,info.telno);
fclose(fp);

Cは初めてなので、無知を許してください。ありがとう。

4

4 に答える 4

4

で文字列に「空白」を読み込む唯一の方法scanf()は、否定されたスキャンセットを使用することです。

// This will read into comment everything up until the newline
scanf(" %[^\n]",info.name); 

ただし、一般的に、得られる答えは「scanfを使用せず」、fgets()代わりに使用することです。

fgets(info.name, sizeof info.name, stdin);

scanf()fgets()などのこの情報の多くは、クイック検索で簡単に取得できることを忘れないでください。


編集: I tried replacing scanf with fgets but when I run the program it skips past the "Enter Name:"

それがあなたによって「スキップ」している場合、それはあなたがバッファに座っていた残りの文字を読んだfgets()ことを意味します。改行文字だったと思います。fgets()stdin

文字列を入力する場合:

john smith

の後に改行'\n'が追加されます'h'。つまりscanf()、文字を読んで改行を残すのfgets()に対し、改行まで/改行を含むすべてを読みます。したがって、これを行う場合:

scanf("%s",info.name);

fgets(info.address, sizeof info.address, stdin);

fgets()「スキップ」されているように見えます。fgets()両方をに置き換えると最初の文字がスキップされると言っている場合は、stdinバッファがクリーンではないため、改行文字を残す前に何かを用意する必要があります。

于 2012-12-19T16:16:58.227 に答える
3

scanf(3)空白が見つかると、引数の変換を停止します。試してみてくださいfgets(3)

于 2012-12-19T16:15:43.333 に答える
2

スペースで名前全体を受け入れる方法はありますか

はい、使用します(とにかく思ったとおりに動作するとは限らないため、fgets()通常は、の代わりにこの関数を使用することをお勧めします):scanf()scanf()

fgets(info.name, sizeof(info.name), stdin);
于 2012-12-19T16:16:48.880 に答える
0

scanf( "%[^ \ r \ n]"、info.name);

これは、CRとLFを除くすべてを受け入れることを意味します。

于 2012-12-19T16:22:29.013 に答える