• ベストアンサー

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

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • C言語について プログラムが動きません

    ゲームのプログラムを作りたいものです。 今、試作の途中の段階で以下のようなプログラムを作ってみたのですが、 コアダンプが表示されてうまく起動しません。 どの点を変更すればいいのか、教えてください。 使っている言語はC言語です。 よろしくお願いいたします。 #include <stdio.h> #include <string.h> struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int attack; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; char names[5][10] = {"v", "w", "x", "y", "z"}; main(){ int s = 0; int a[3]; int i; int m; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60}, }; printf("好きなモンスターを3つ選んでください\n\n"); while (s < 1){ for (i = 0; i++; i<3){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m++; m < 4) printf("%d, %s\n", m+1, monster[m].name); printf("5, %s\n\n", monster[4].name); scanf("%d", a[i]); printf("%d体目 : %s\n\n", i+1, monster[a[i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i++; i<2) printf("%d体目 : %s ", i+1, monster[a[i]-1].name); printf("3体目 : %s\n\n", monster[a[2]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &i); if(i=1) return s = 1; else return s = 0; } }

  • 配列の中を変更

    入力したnameに、入力したageの数だけ文字を進める(例えばnameがOda、ageが12→表示結果がAmp)にする関数を作成しようとしたのですが、やり方がまったくわかりません。 そもそもこのような場合、文字1つ1つに別の配列を使わなければならないのでしょうか? #include <stdio.h> #define N 1 #define NAME 20 typedef struct{ char name[NAME]; char age; } person; int main(void){ int i; person persons[N]; for(i=0;i<N;i++){ printf("name > "); scanf("%s" , persons[i].name); printf("age > "); scanf("%d" , &persons[i].age); } for(i=0;i<N;i++){ printf("name = %s\n" , persons[i].name); printf("age = %d\n" , persons[i].age); } return 0; }

  • クイックソート

    名前と年齢を入力したあとに、1人の名前を入力して2分探索で探索する プログラムを書いたのですが、これにクイックソート法の整列手続き(辞書式順序)を加えたいのですが、どこに何を加えたら動くのか教えていただけないでしょうか。 まだプログラムを習い始めたばかりでプログラム自体も、字下げもろくにできてませんが、どうかよろしくお願いします。 #include<stdio.h> #include<string.h> #include<conio.h> struct record{ char key[20] int dat; }; struct record A[100]; int n=0; void insert(char x[],int y){ n++; strcpy(A[n].key,x); A[n].dat=y; } int binarysearch(char target[],int *pos){ int top,bottom,found,pt; top=n; bottom=1; found=0; while(top>=bottom&&!found){ pt=(top+bottom)/2; if(strcmp(A[pt].key,target)>0) top=pt-1; else if (strcmp(A[pt].key,target)<0) bottom=pt+1; else found=1; } *pos=pt; return found; } int main(void){ char name[100],sname[100]; int old,ptr; scanf("%s",name); while(strcmp(name,"0")){ scanf("%d",&old); insert(name,old); scanf("%s",name); } printf("指定する名前を入力してください\n"); scanf("%s",name); if(binarysearch(sname,&ptr)){ printf("%s %d\n",A[ptr].key,A[ptr].dat); } else printf("いません。\n"); getch(); return0; }

  • プログラムがちゃんと動きません

    C言語です まず人数を入力した後に 名前と身長と体重を入力する関数get_psと それらの情報を人数分出力する関数print_psを使い mainで実行するというプログラムを作ったのですが 思うように動きません どのようにすればいいでしょうか? #include<stdio.h> struct ps_data{ char name[20]; double hgt; double wgt; }; void get_ps(struct ps_data *p,int a) { int i=0; printf("name height weight:"); scanf("%s %lf %lf",(p+i)->name,&(p+i)->hgt),&(p+i)->wgt); i++; } void print_ps(struct ps_data *p,int a) { int i; for(i=0;i<a;i++) printf("%s :height=%lf weight=%lf \n",(p+i)->name,(p+i)->hgt,(p+i)->wgt); } int main(void) { int n,i; struct ps_data ps_dat[20]; printf("Number:"); scanf("%d",&n); for(i=0;i<n;i++) { get_ps(ps_dat,i); } print_ps(ps_dat,n); return 0; }

  • おみくじプログラムですがじっこうできません。

    #include<stdio.h> int main() { int i; char data[5][10]={"大吉","小吉","吉","凶","大凶"}; printf("1~5の間の整数を入力:"); scanf("%d",&i); while(i<1&&i>5){ printf("入力値が不適切です。\n"); printf("1~5でお願いします。\n"); scanf("%d",&i); } printf("%s\n",data[5][i-1]); return 0; } 自分で考えてみたのですが、どうしたらいいかわかりません。

  • リストの削除について(構造体)

    リストの削除のプログラムを実行して行ってみると、リストの削除処理中にプログラムが終わって変更後処理がうまく表示されません。どこが間違っているかが分からないしだいです。返答のほどよろしくお願いいたします。 #include<stdio.h> #include<malloc.h> #include<string.h> struct list{ char name[20]; int age; struct list *next; }; void main(void) { struct list *head, *p, *n, *old; char key[20]; /*ダミーノード作成*/ head = (struct list*)malloc(sizeof(struct list)); old = head; while(p = (struct list*)malloc(sizeof(struct list)), printf("name age入力\n"), scanf("%s %d", p -> name, &p -> age) != EOF){ old -> next = p; old = p; } free(p); old -> next = NULL; p = head -> next; printf("変更前リスト\n"); while(p != NULL){ printf("name:%s age:%d\n",p -> name, p -> age); p = p -> next; } printf("削除key入力(name)\n"); gets(key); n = head; while(n != NULL){ old = n; n = n -> next; //printf("n -> name %s\n", n -> name); if(strcmp(n -> name, key) == 0){ printf("%s削除\n", key); //printf("n -> name %s old -> name %s\n", n -> name, old -> name); old -> next = n -> next; } } p = head -> next; printf("変更後リスト\n"); while(p != NULL){ printf("name:%s age:%d\n", p -> name, p -> age); p = p -> next; } }

  • C言語・標準入力でquitを入力で終わるプログラム

    C言語標準入力でquitを入力で終わるプログラムを作っているのですが うまくいきません #include <stdio.h> int main(void) { int i, n; double data[100]; printf("数字を入力してください。\n"); printf("入力を終えるときにはCtrl-dを押してください。\n"); n = 0; while (scanf("%lf", &data[n]) != EOF) { n++; } for (i=0; i<n; i++) { printf("data[%d] = %f\n", i, data[i]); } return (0); } と今はとりあえづ作ってみたのですが 今のままではCtrl-dでループから抜ける形になっています strcmp関数を使うとは思うのですが strcmp関数はchar型なのでエラーが出てしまいます; このやり方じゃないchar型にしてやり直さないといけないでしょうか; Linux CentOS gcc でやっています 標準入力で数字を入力しそれを格納 quitを入力するまで繰り返す quitを入力で終了、これまで格納していた文字列の表示 簡単なプログラムの流れとしては上記の感じです よろしくお願いします。

  • 'strcpy': 識別子が見つかりません

    またもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。

  • 'strcpy': 識別子が見つかりません

    初心者でまたもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。