- ベストアンサー
CTR-Dでプログラムを終了
学校の課題で、 --- 探索キーとして名前を入力し、入力と一致した場合、その名前と年齢を印字することを繰り返す。 CTR-Dが入力されたとき、プログラムを終了する。 また、文字比較の為に関数strcmpを使用する。 --- という課題が出されたのですが、while(scanf("%s", name) != EOF)を入れるとうまくいきません。 自分で途中までやったものは↓のものです。 どこが違うのか教えてください(>_<) #include<stdio.h> #include<string.h> #define N 10 struct card{ char *name; int age; }; struct card meibo[N] = { "Takahashi", 14, "Kobayashi", 15, "Hosokawa", 17, "Sugimoto", 18, "Sawai", 19, "Itou", 20, "Kawai", 22, "Ishikura", 24, "Oda", 25, "Nakamura", 28 }; int main(void){ char *name; int i; printf("name? : "); scanf("%s", name); while (scanf("%s", name) != EOF){ for (i=0; i<N; i++){ if (strcmp(name, meibo[i].name) == 0) break; } } if (i<N){ printf("%s is %d.\n", meibo[i].name, meibo[i].age);} else{ printf("Not found.\n");} return 0; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★回答 間違い: ・『scanf("%s", name);』の『name』はポインタを渡すのではなく、文字配列のアドレスを渡しますよ。 ・回答者 No.1 さんの『char name[20];』と宣言します。→『char *name;』ではありません。 関数: ・『scanf』の戻り値は読み込んだ(代入された)フィールド数です。 ・戻り値が『0』の場合は、代入されなかったことを意味します。 ・エラーが発生した場合は『EOF』が戻りますね。 補足: ・『CTR-D』とは、文字コード 0x04 のことですよ。 ・大まかな点でソース内容はあっていますが、微妙に違うため注意しましょう。 ・最後に、main関数のみですがサンプルを表記しますよ。→データ定義は正しい。 サンプル: int main( void ) { char name[ 256 ]; ←適当なサイズ int i; printf( "name? : "); scanf( "%s", name ); while ( scanf("%s",name) != EOF ){ for ( i = 0 ; i < N ; i++ ){ if ( name[0] == 0x04 ){ return( 0 ); ←『CTR-D』を検出、プログラムを終了部分 } if ( strcmp(name,meibo[i].name) == 0 ){ break; } } } if ( i < N ){ printf( "%s is %d.\n", meibo[i].name, meibo[i].age ); } else{ printf( "Not found.\n" ); } return( 0 ); } ・最後に、頑張っていますね。応援していますよ。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
ちなみにだけど, 環境 (OS やコンパイラ) は?
サンプルです。 #include <stdio.h> #include <string.h> #define N (10) typedef struct { char name[20]; int age; } card; int main(void) { card meibo[N] = { { "Takahashi", 14 }, { "Kobayashi", 15 }, { "Hosokawa", 17 }, { "Sugimoto", 18 }, { "Sawai", 19 }, { "Itou", 20 }, { "Kawai", 22 }, { "Ishikura", 24 }, { "Oda", 25 }, { "Nakamura", 28 }, }; char name[20]; int n, i; while (1) { printf("探索したい名前は:"); n = scanf("%s", name); if (n == EOF || name[0] == 4) { break; } for (i = 0; i < N; i++) { if (strcmp(name, meibo[i].name) == 0) { break; } } if (i < N) { printf("%s is %d.\n", meibo[i].name, meibo[i].age); } else { printf("Not found.\n"); } } return 0; }
お礼
大変遅くなってしまってすみません(>_<) while(1) にすると分かりやすいですね! ありがとうございました!