• ベストアンサー

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; }

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★回答 間違い: ・『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)
回答No.3

ちなみにだけど, 環境 (OS やコンパイラ) は?

noname#22058
noname#22058
回答No.1

サンプルです。 #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; }

apple_cube
質問者

お礼

大変遅くなってしまってすみません(>_<) while(1) にすると分かりやすいですね! ありがとうございました!

関連するQ&A