• ベストアンサー

C言語 初心者

コンパイルエラーはでないのに、 登録した単語を表示できません。 表示のところだと思うのですが・・・ /********************/ /*--- 英単語辞書 ---*/ /********************/ #include <stdio.h> #include <stdio.h> #define NUMBER 50 /*登録数*/ #define MAX_NAME 20 /*単語の最大文字数*/ #define MAX_WAYAKU 30 /*和訳の最大文字数*/ /************************/ /*--- 単語帳の構造体 ---*/ /************************/ typedef struct { char name[MAX_NAME]; /*単語*/ char wayaku[MAX_WAYAKU]; /*和訳*/ }words; /************************************************/ /*------ 単語と和訳の登録 ------*/ /* 関数tourokuword()は引数words tango[]の、イン*/ /*クリメントしたtango_counの順番に格納する。  */ /************************************************/ void tourokuword(words tango[], int tango_count) { char word[MAX_NAME]; /*単語の名前*/ char wa[MAX_WAYAKU]; /*単語の和訳*/ printf("[単語]:"); scanf("%s", word); /*単語を単語帳に登録*/ strcpy(tango[tango_count].name, word); printf("[和訳]:"); scanf("%s", wa); /*和訳を単語帳に登録*/ strcpy(tango[tango_count].wayaku, wa); } /***********************************************/ /*----- 単語の交換 -----*/ /***********************************************/ void swaps(words *x, words *y) { words temp = *x; strcpy(temp, *x); strcpy(*x, y); strcpy(*y, temp); } /***********************************************/ /*----- 登録された単語を表示する -----*/ /* 関数printword()は引数words tango[]の、イン */ /*クリメントしたtango_counの順番に表示する。  */ /***********************************************/ void printword(words tango[], int tango_count) { int i = 0; int j; puts("登録されている単語を表示します。\n"); for( i = 0; i < tango_count; i++){ for(j = i + 1; j < tango_count; j++){ if(strcmp(tango[i].name, tango[j].name) > 0){ swaps(&tango[i], &tango[j]); } } } for (i = 0 ; i < tango_count; i++) { printf("[単語]:%s\n",tango[i].name); /*単語の表示*/ printf("[和訳]:%s\n",tango[i].wayaku); /*和訳の表示*/ } } /****************/ /*--- メイン ---*/ /****************/ int main(void) { words tangochou[NUMBER]; /*単語帳に50件登録*/ int menu_num; /*メニュー番号*/ int slct_num; /*選択番号*/ int tango_count = 0; /*登録数のカウント*/ while(1){ /****************************/ /*--- メニュー番号の入力 ---*/ /****************************/ do { printf("1・・・登録. 2・・・表示. 3・・・終了.\n"); printf("メニュー番号を入力してください。:"); scanf("%d", &menu_num); /*メニュ番号の入力*/ if (menu_num > 0){ break; } }while(menu_num != 0); /*メニュ番号が該当しない時は再入力*/ switch (menu_num){ case 1 :/*--- メニュー 1:単語と和訳の登録 ---*/ while(1) { if (tango_count < NUMBER){ printf("英単語と和訳を入力してください。:\n"); /*単語と和訳の登録*/ tourokuword(tangochou, tango_count); tango_count++; }else { puts("50件以上です。\n"); return 0; /*50件以上は終了する*/ } /*登録を続けるか?*/ printf("続けますか【Yes・・・1/No…0】:"); scanf("%d", &slct_num); if(slct_num != 1){ /*0なら終了。1なら継続。*/ break; } } break; case 2 :/*--- メニュー 2:登録された単語と和訳の表示 ---*/ printword(tangochou, tango_count); /*単語と和訳の表示*/ break; case 3 :/*--- メニュー 3:終了 ---*/ puts("終了します。\n"); return (0); default:/*--- メニュー 4:非メニュー番号の処理 ---*/ puts("メニュー番号が間違っています。"); break; } } return (0); }

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>strcpy(temp, *x); >strcpy(*x, y); >strcpy(*y, temp); ここは完全に変ですね。 実行ファイルが出来ているとしても、ワーニングエラー出てませんか?出ていないとしたらコンパイラの種類を教えてください。 strcpyは文字列のコピー専用で'\0'を見つけたらコピーを終了します。この関数では構造体全部のコピーはできませんよ。 それと、そろそろバグは自分で原因を追求できるように訓練を始めましょう。デバッガを使ったり、色々なところにprintfを入れてみて変数値の変化を確かめたり自分で出来るようにならないとプログラマとして自立できませんよ。

hatenan114
質問者

補足

お世話になっています。 今、皆様のおかげで以下のソースまでたどり着きましたが、並べ替えが出来ていない状況です。少しアドバイスをお願いします。 /********************/ /*--- 英単語辞書 ---*/ /********************/ #include <stdio.h> #include <stdio.h> #define NUMBER 50 /*登録数*/ #define MAX_NAME 20 /*単語の最大文字数*/ #define MAX_WAYAKU 30 /*和訳の最大文字数*/ /************************/ /*--- 単語帳の構造体 ---*/ /************************/ typedef struct { char name[MAX_NAME]; /*単語*/ char wayaku[MAX_WAYAKU]; /*和訳*/ }words; /************************************************/ /*------ 単語と和訳の登録 ------*/ /* 関数tourokuword()は引数words tango[]の、イン*/ /*クリメントしたtango_counの順番に格納する。  */ /************************************************/ void tourokuword(words tango[], int tango_count) { char word[MAX_NAME]; /*単語の名前*/ char wa[MAX_WAYAKU]; /*単語の和訳*/ printf("[単語]:"); scanf("%s", word); /*単語を単語帳に登録*/ strcpy(tango[tango_count].name, word); printf("[和訳]:"); scanf("%s", wa); /*和訳を単語帳に登録*/ strcpy(tango[tango_count].wayaku, wa); } /***********************************************/ /*----- 単語の交換 -----*/ /***********************************************/ void swaps(words *x, words *y) { words temp = *x; strcpy(temp, *x); strcpy(*x, *y); strcpy(*y, temp); } /***********************************************/ /*----- 登録された単語を表示する -----*/ /* 関数printword()は引数words tango[]の、イン */ /*クリメントしたtango_counの並び替えて表示する */ /***********************************************/ void printword(words tango[], int tango_count) { int i = 0; int j; puts("登録されている単語を表示します。\n"); for( i = 1; i <= tango_count; i++){ for(j = - 1; j <= tango_count; j++){ if(strcmp(tango[i - 1].name, tango[i].name) > 0){ j = i - 1; swaps(&tango[i], &tango[j]); printf("[単語]:%s\n", tango[i].name); /*単語の表示*/ printf("[和訳]:%s\n", tango[i].wayaku); /*和訳の表示*/ } } } } /****************/ /*--- メイン ---*/ /****************/ int main(void) { words tangochou[NUMBER]; /*単語帳に50件登録*/ int menu_num; /*メニュー番号*/ int slct_num; /*選択番号*/ int tango_count = 0; /*登録数のカウント*/ while(1){ /****************************/ /*--- メニュー番号の入力 ---*/ /****************************/ do { printf("1・・・登録. 2・・・表示. 3・・・終了.\n"); printf("メニュー番号を入力してください。:"); scanf("%d", &menu_num); /*メニュ番号の入力*/ if (menu_num > 0){ break; } }while(menu_num != 0); /*メニュ番号が該当しない時は再入力*/ switch (menu_num){ case 1 :/*--- メニュー 1:単語と和訳の登録 ---*/ while(1) { if (tango_count < NUMBER){ printf("英単語と和訳を入力してください。:\n"); /*単語と和訳の登録*/ tourokuword(tangochou, tango_count); tango_count++; }else { puts("50件以上です。\n"); return 0; /*50件以上は終了する*/ } /*登録を続けるか?*/ printf("続けますか【Yes・・・1/No…0】:"); scanf("%d", &slct_num); if(slct_num != 1){ /*0なら終了。1なら継続。*/ break; } } break; case 2 :/*--- メニュー 2:登録された単語と和訳の表示 ---*/ printword(tangochou, tango_count); /*単語と和訳の表示*/ break; 以下省略。

その他の回答 (14)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.15

「長さ」のところだけ生成させるんじゃなくって, %??s 全体を生成させれば (それにあわせてマクロの名前をわかりやすくすれば) いいと思うんだけど>#12.

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.14

ご参考: 文字列の読み込みに最大文字数を指定して scanf() を使い、ソートに qsort() を使って書き直しておきました。 がんばってください。 ======= /********************/ /*--- 英単語辞書 ---*/ /********************/ #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #define TOSTRING_(s) #s #define TOSTRING(s) TOSTRING_(s) /* 一行読み飛ばす */ void skipln() { int c; while ((c = getchar()) != EOF) if (c == '\n') break; } #define NUMBER 50 /*登録数*/ #define MAX_NAME 20 /*単語の最大文字数*/ #define MAX_WAYAKU 30 /*和訳の最大文字数*/ /************************/ /*--- 単語帳の構造体 ---*/ /************************/ typedef struct { char name[MAX_NAME + 1]; /*単語*/ char wayaku[MAX_WAYAKU + 1]; /*和訳*/ }words; /************************************************/ /*------ 単語と和訳の登録 ------*/ /* 関数tourokuword()は引数words tango[]の、イン*/ /*クリメントしたtango_counの順番に格納する。  */ /************************************************/ void tourokuword(words tango[], int tango_count) { printf("[単語]:"); /*単語を単語帳に登録*/ scanf("%" TOSTRING(MAX_NAME) "s", tango[tango_count].name); skipln(); printf("[和訳]:"); scanf("%" TOSTRING(MAX_WAYAKU) "s", tango[tango_count].wayaku); skipln(); } /* words の比較関数(qsort()用)) */ int wcompare(const void *a, const void *b) { return strcmp(((const words *)a)->name, ((const words *)b)->name); } /***********************************************/ /*----- 登録された単語を表示する -----*/ /* 関数printword()は引数words tango[]の、イン */ /*クリメントしたtango_counの順番に表示する。  */ /***********************************************/ void printword(words tango[], int tango_count) { int i; puts("登録されている単語を表示します。\n"); for (i = 0 ; i < tango_count; i++) { printf("[単語]:%s\n",tango[i].name); /*単語の表示*/ printf("[和訳]:%s\n",tango[i].wayaku); /*和訳の表示*/ } } /****************/ /*--- メイン ---*/ /****************/ int main(void) { words tangochou[NUMBER]; /*単語帳に50件登録*/ int change = 0; /* 登録して変化したかを示す */ char menu_num; /*メニュー番号*/ char slct_num; /*選択番号*/ int tango_count = 0; /*登録数のカウント*/ while(1){ int ok = 0; /* 入力番号終了を示す */ /****************************/ /*--- メニュー番号の入力 ---*/ /****************************/ do { printf("1・・・登録. 2・・・表示. 3・・・終了.\n"); printf("メニュー番号を入力してください。:"); scanf(" %c", &menu_num); /*メニュ番号の入力*/ skipln(); switch (menu_num) { case '1': case '2': case '3': ok = 1; break; } }while(!ok); /*メニュ番号が該当しない時は再入力*/ switch (menu_num){ case '1' :/*--- メニュー 1:単語と和訳の登録 ---*/ while(1) { if (tango_count < NUMBER){ printf("英単語と和訳を入力してください。:\n"); /*単語と和訳の登録*/ tourokuword(tangochou, tango_count); change = 1; ++tango_count; }else { puts("51件以上です。\n"); return 1; /*51件以上は終了する*/ } /*登録を続けるか?*/ printf("続けますか【Yes・・・1/No…0】:"); scanf(" %c", &slct_num); skipln(); if(slct_num != '1'){ /*0なら終了。1なら継続。*/ break; } } break; case '2' :/*--- メニュー 2:登録された単語と和訳の表示 ---*/ if (change) qsort(tangochou, tango_count, sizeof tangochou[0], wcompare); printword(tangochou, tango_count); /*単語と和訳の表示*/ change = 0; break; case '3' :/*--- メニュー 3:終了 ---*/ puts("終了します。\n"); return (0); default:/*--- メニュー 4:非メニュー番号の処理 ---*/ puts("メニュー番号が間違っています。"); break; } } return (0); }

hatenan114
質問者

お礼

回答ありがとうございます。 qsort についてべんきょうします。 またよろしくお願いします。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.13

「プリプロセッサにフォーマット部の構築」じゃなくて、「プリプロセッサとコンパイラに…」か。。。失礼しました^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.12

 #define TOSTRING(s) TOSTRING_(s)  #define TOSTRING_(S) #s  #define MAX_NAME 20  #define MAX_WAYAKU 30  typedef struct {  char name[MAX_NAME + 1];  char wayaku[MAX_WAYAKU + 1];  }words;  で、マクロが数字のみで定義してあるとすれば、  void tourokuword( words tango[], int tango_count )  {   /* 単語,和訳を単語帳に登録 */   printf( "[単語]:" ); scanf( "%" TOSTRING(MAX_NAME) "s", tango[tango_count].name );   printf( "[和訳]:" ); scanf( "%" TOSTRING(MAX_WAYAKU) "s", tango[tango_count].wayaku );  } として、プリプロセッサにフォーマット部の構築をやらせますか?^^ わかりづらいので、お勧めはしませんけど^^ scanf() のフォーマットの s の最大文字数って、ピリオドの前じゃなかったでしたっけ?違ったかな? ピリオドの後は、代入する最小文字数っていうのかな?なので、ここでは、ピリオドはつけてません^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.11

あと、scanf() でフォーマット部にそのまま最大文字数を書きいれたときは、マクロの値を変更するときはフォーマット部も書き換えるように注意しましょう。フォーマット部を関数内で構築して scanf() に渡すようにすれば、不注意からの修正忘れエラーの防止になりますが。 なるほど。K&Rの第1版のころは、構造体の代入や構造体をそのまま関数に渡したり、関数から戻したりできませんでしたね。なつかしい^^ わたしは、一昔前に、K&Rの第2版で勉強しました。C99に対応した K&Rの第3版みたいなのは出版されてるのかしら?^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.10

あぁ、そういえば、そうですね。 swaps() では  ・yaemon_2006 さんの指摘されてる構造体のままのスワップする のと、文字列の読み込みでは、  ・Oh-Orange さんの指摘されている「最大文字数指定」で scanf() する のほうがわかりよいですね^^ 文字列を読み込みたいのは、「空白でない文字からなる文字列」なのか、「前後の空白を取り除いた、行全体の文字列」なのかよくわかりませんでしたけど、一応、余った文字は、行の最後まで読み飛ばしてあります^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.9

なんとなく「こうやりたい」のだろうと思って直してみました。 なので、出力ごとのソート(?)などはそのままです。 ==== /********************/ /*--- 英単語辞書 ---*/ /********************/ #include <stdio.h> #include <string.h> #include <ctype.h> void skipws() { int c; while ((c = getchar()) != EOF) { if (!isspace(c)) { ungetc(c, stdin); break; } } } void skipln() { int c; while ((c = getchar()) != EOF) if (c == '\n') break; } void get_string(int n, char *buf) { int c, m = 0; skipws(); while (m < n && (c = getchar()) != EOF) { if (isspace(c)) { ungetc(c, stdin); break; } buf[m++] = c; } buf[m] = '\0'; skipln(); } #define NUMBER 50 /*登録数*/ #define MAX_NAME 20 /*単語の最大文字数*/ #define MAX_WAYAKU 30 /*和訳の最大文字数*/ /************************/ /*--- 単語帳の構造体 ---*/ /************************/ typedef struct { char name[MAX_NAME + 1]; /*単語*/ char wayaku[MAX_WAYAKU + 1]; /*和訳*/ }words; /************************************************/ /*------ 単語と和訳の登録 ------*/ /* 関数tourokuword()は引数words tango[]の、イン*/ /*クリメントしたtango_counの順番に格納する。  */ /************************************************/ void tourokuword(words tango[], int tango_count) { printf("[単語]:"); /*単語を単語帳に登録*/ get_string(MAX_NAME, tango[tango_count].name); printf("[和訳]:"); get_string(MAX_WAYAKU, tango[tango_count].wayaku); } /***********************************************/ /*----- 単語の交換 -----*/ /***********************************************/ void swaps(words *x, words *y) { char ntmp[MAX_NAME + 1]; char wtmp[MAX_WAYAKU + 1]; strcpy(ntmp, x->name); strcpy(x->name, y->name); strcpy(y->name, ntmp); strcpy(wtmp, x->wayaku); strcpy(x->wayaku, y->wayaku); strcpy(y->wayaku, wtmp); } /***********************************************/ /*----- 登録された単語を表示する -----*/ /* 関数printword()は引数words tango[]の、イン */ /*クリメントしたtango_counの順番に表示する。  */ /***********************************************/ void printword(words tango[], int tango_count) { int i = 0; int j; puts("登録されている単語を表示します。\n"); for( i = 0; i < tango_count; i++){ for(j = i + 1; j < tango_count; j++){ if(strcmp(tango[i].name, tango[j].name) > 0){ swaps(&tango[i], &tango[j]); } } } for (i = 0 ; i < tango_count; i++) { printf("[単語]:%s\n",tango[i].name); /*単語の表示*/ printf("[和訳]:%s\n",tango[i].wayaku); /*和訳の表示*/ } } /****************/ /*--- メイン ---*/ /****************/ int main(void) { words tangochou[NUMBER]; /*単語帳に50件登録*/ char menu_num; /*メニュー番号*/ char slct_num; /*選択番号*/ int tango_count = 0; /*登録数のカウント*/ while(1){ int ok = 0; /****************************/ /*--- メニュー番号の入力 ---*/ /****************************/ do { printf("1・・・登録. 2・・・表示. 3・・・終了.\n"); printf("メニュー番号を入力してください。:"); scanf(" %c", &menu_num); /*メニュ番号の入力*/ switch (menu_num) { case '1': case '2': case '3': ok = 1; break; } }while(!ok); /*メニュ番号が該当しない時は再入力*/ switch (menu_num){ case '1' :/*--- メニュー 1:単語と和訳の登録 ---*/ while(1) { if (tango_count < NUMBER){ printf("英単語と和訳を入力してください。:\n"); /*単語と和訳の登録*/ tourokuword(tangochou, tango_count); ++tango_count; }else { puts("51件以上です。\n"); return 1; /*51件以上は終了する*/ } /*登録を続けるか?*/ printf("続けますか【Yes・・・1/No…0】:"); scanf(" %c", &slct_num); if(slct_num != '1'){ /*0なら終了。1なら継続。*/ break; } } break; case '2' :/*--- メニュー 2:登録された単語と和訳の表示 ---*/ printword(tangochou, tango_count); /*単語と和訳の表示*/ break; case '3' :/*--- メニュー 3:終了 ---*/ puts("終了します。\n"); return (0); default:/*--- メニュー 4:非メニュー番号の処理 ---*/ puts("メニュー番号が間違っています。"); break; } } return (0); }

hatenan114
質問者

お礼

回答有難うございます。 このソースを少し解読してみます。 これからよろしくお願いします。

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

★追記。 ・scanf() 関数の書式列に入力可能な文字数を指定しておくと安全になります。  例えば  scanf( "%.19s", word );  とします。これが出来るため直接構造体のメンバを引数に渡すことも可能です。  つまり  void tourokuword( words tango[], int tango_count )  {   /* 単語,和訳を単語帳に登録 */   printf( "[単語]:" ); scanf( "%.19s", tango[tango_count].name );   printf( "[和訳]:" ); scanf( "%.49s", tango[tango_count].wayaku );  }  こんな感じでも行えます。 ・以上。

hatenan114
質問者

お礼

ありがとうございます。 勉強なります。

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

★構造体はそのまま代入演算子で行えます。 ・回答者 No.3 さんの回答通りです。  関数を利用するなら回答者 No.4 さんのアドバイスにある memcpy() 関数で出来ます。  今回は swaps() 関数の >strcpy(temp, *x); >strcpy(*x, y); >strcpy(*y, temp);  の3行を  temp = *x;  *x = *y;  *y = temp;  の3行にすることで上手くいきます。 ・ちなみに >words temp = *x;  ↑  既に自分で構造体のコピーを代入演算子を用いて行っていますよ。  これの書き方で良かったわけです。 ・あと printword() 関数はバブルソートされて表示されますね。  ソートする部分は関数で分けてみてはどうかな。  例えば  void sortword( words tango[], int tango_count );  という関数を作ってみる。  そして表示だけの関数を  void printword( words tango[], int tango_count );  という関数にする。 ・以上。参考に。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

hana-hana3さん、ちゃんとtypedefしたwordsは使われてますよ。その問題はなさそうです。 補足として、ここまで作ったなら文字列長のガードもした方が良さそうですね。 19文字と49文字の文字列長の制限を加えることをお勧めします。入力時のバッファもギリギリだと危険なので余裕を見たほうが良いでしょう。

関連するQ&A

  • 構造体配列とポインタについて

    いつもお世話になっています。 皆様には、本当にお世話になっています。 先日、皆様にアドバイスをいただいたのですが、私の勉強不足で結局・・・並び替えて表示できなかったです。 大変申し訳ないのですが、どこがダメなのか教えてください。 /********************/ /*--- 英単語辞書 ---*/ /********************/ #include <stdio.h> #include <string.h> #define NUMBER 50 /*登録数*/ #define MAX_NAME 20 /*単語の最大文字数*/ #define MAX_WAYAKU 30 /*和訳の最大文字数*/ /************************/ /*--- 単語帳の構造体 ---*/ /************************/ typedef struct { char name[MAX_NAME]; /*単語*/ char wayaku[MAX_WAYAKU]; /*和訳*/ }words; /***********************************************/ /*----- 単語の交換 -----*/ /***********************************************/ void swaps(words x, words y) { words temp = x; temp = x; x = y; y = temp; } /************************************************/ /*------ 単語と和訳の登録 ------*/ /* 関数tourokuword()は引数words tango[]の、イン*/ /*クリメントしたtango_counの順番に格納する。  */ /************************************************/ void tourokuword(words tango[], int tango_count) { char word[MAX_NAME]; /*単語の名前*/ char wa[MAX_WAYAKU]; /*単語の和訳*/ int i = 0; int j; printf("[単語]:"); scanf("%s", word); /*単語を単語帳に登録*/ strcpy(tango[tango_count].name, word); printf("[和訳]:"); scanf("%s", wa); /*和訳を単語帳に登録*/ strcpy(tango[tango_count].wayaku, wa); for( i = 0; i < tango_count; i++){ if(strcmp(tango[tango_count].name, tango[i].name) > 0){ swaps(tango[tango_count], tango[i]); } } } /***********************************************/ /*----- 登録された単語を表示する -----*/ /* 関数printword()は引数words tango[]の、イン */ /*クリメントしたtango_counの並び替えて表示する */ /***********************************************/ void printword(words tango[], int tango_count) { int i = 0; puts("登録されている単語を表示します。\n"); for (i = 0 ; i < tango_count; i++) { printf("[単語]:%s\n", tango[i].name); /*単語の表示*/ printf("[和訳]:%s\n", tango[i].wayaku); /*和訳の表示*/ } } /****************/ /*--- メイン ---*/ /****************/ int main(void) { words tangochou[NUMBER]; /*単語帳に50件登録*/ int menu_num; /*メニュー番号*/ int slct_num; /*選択番号*/ int tango_count = 0; /*登録数のカウント*/ while(1){ /****************************/ /*--- メニュー番号の入力 ---*/ /****************************/ do { printf("1・・・登録. 2・・・表示. 3・・・終了.\n"); printf("メニュー番号を入力してください。:"); scanf("%d", &menu_num); /*メニュ番号の入力*/ if (menu_num > 0){ break; } }while(menu_num != 0); /*メニュ番号が該当しない時は再入力*/ switch (menu_num){ case 1 :/*--- メニュー 1:単語と和訳の登録 ---*/ while(1) { if (tango_count < NUMBER){ printf("英単語と和訳を入力してください。:\n"); /*単語と和訳の登録*/ tourokuword(tangochou, tango_count); tango_count++; }else { puts("50件以上です。\n"); return 0; /*50件以上は終了する*/ } /*登録を続けるか?*/ printf("続けますか【Yes・・・1/No…0】:"); scanf("%d", &slct_num); if(slct_num != 1){ /*0なら終了。1なら継続。*/ break; } } break; case 2 :/*--- メニュー 2:登録された単語と和訳の表示 ---*/ printword(tangochou, tango_count); /*単語と和訳の表示*/ break; case 3 :/*--- メニュー 3:終了 ---*/ puts("終了します。\n"); return (0); default:/*--- メニュー 4:非メニュー番号の処理 ---*/ puts("メニュー番号が間違っています。"); break; } } return (0); }

  • 教えてください。

    このソースの中で、間違えているところはどこですか? 誰か助けてください。 /* 英単語辞書の登録と表示 */ #include <stdio.h> #define NUMBER 50 /*登録数*/ /*--- 単語帳の構造体 ---*/ struct words { char name[20]; char wayaku[50]; }; /*--- 単語と和訳の登録 ---*/ struct words touroku_word(struct words tangochou[], char ) { int count = 0; char word[20],wa[50]; while(1) { printf("英単語を登録してください。:"); scanf("%s", word); strcpy(tangochou[],*s); count++; putchar('\n'); printf("和訳を入力してください。:"); scanf("%s", wa); strcpy(tangochou[],*s); putchar('\n'); if (i < NUMBER){ return (0); } if (cont == 0){ break; } } } /*--- 登録された単語を表示する ---*/ void print_word(struct words tangochou[],int count) { int i = 0; puts("登録されている単語を表示します。\n"); for (i ; i < count; i++) { printf("[単語]:%d\n",tangochou[i].name); printf("[和訳]:%d\n",tangochou[i].wayaku); } } int main(void) { struct words tangochou[2]; int menu; while(1){ do { printf("メニュー番号を入力してください。:"); scanf("%d", &menu); if (menu > 0){ break; } }while(menu != 0); switch (menu){ case 1 : touroku_word(tangochou[]); break; case 2 : print_word(tangochou[]); break; case 3 :puts("終了します。\n"); return (0); default :puts("メニュー番号が間違っています。"); break; } } return (0); }

  • 初心者です。

    いつもお世話になっています。 現在、ポインタと構造体と配列をつかって、構造体を使った単語帳を作成しています。以下のソースで、行き詰まってしまいした。 質問内容としては、今のソースから、単語と意味を登録するにはどうすればいいでしょうか?できれば、ポインタの使用時には、詳しく教えていただけないでしょうか。宜しくお願いします。 * 英単語辞書の登録と表示 */ #include <stdio.h> #define NUMBER 50 /*登録数*/ /*--- 単語帳の構造体 ---*/ struct words{ char name[20]; char wayaku[50]; }; /*--- 単語と和訳の登録 ---*/ /*--- 登録された単語を表示する ---*/ int main(void) { struct words name[] = {0}; struct words wayaku[] = {0}; char word = 0, wa = 0; char *p, *q; int menu; while(1){ do { printf("メニュー番号を入力してください。:"); scanf("%d", &menu); if (menu > 0){ break; } }while(menu != 0); switch (menu){ case 1 :printf("英単語を登録してください。:"); scanf("%s", word); p = &word; putchar('\n'); printf("和訳を入力してください。:"); scanf("%s", wa); q = &wa; putchar('\n'); break; case 2 :puts("登録されている単語を表示します。\n"); break; case 3 :puts("終了します。\n"); return (0); default :puts("メニュー番号が間違っています。"); break; } } ; return (0); }

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • C言語 初心者です。

    今、英単語帳を作っているのですが、以下のソースではできません。 作ろうとしているプログラムは、a bを登録した場合、次がaabと来たら、 a aab bといったようにしたいのですが、できません。教えてください。 #include <stdio.h> #include <string.h> #define NUMBER 50 /*--- 単語帳の構造体*/ typedef struct { char *word; } words; /*--- 文字列strから文字列wordを検索する ---*/ char *str_chr(const char *str, int w) { for ( ; *str; *str++){ if (*str == w){ return ((char *)str); } } return (NULL); /*検索したが該当しないときはNULLを返す*/ } /*--- 単純交換ソート ---*/ void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*--- 配列dataの先頭n個の要素を昇順にソート ---*/ void sort(words data[], int n) { int k = n - 1; while (k >= 0){ int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].word > data[i].word){ j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { words word[NUMBER][20] = {{0},{0}}; char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char w[128], *p; int count = 0; do{ printf("単語を入力してください。:"); /*単語を入力する*/ scanf("%s", w); p = str_chr(str, w); }while(p == NULL); count++; if(count >= NUMBER){ /*登録件数を調べる*/ printf("件数いっぱいです。\n"); } return (0); sort(word, NUMBER); return (0); }

  • C言語

    はじめまして。 C言語を学習しております。 参考書の練習問題19(下記)で以下の部分がどうしても理解できません。 1、【(People*)mallock】の部分で、mallockの前のPeopleを()でくくる意味とPeopleの後に*を付ける意 味がわかりません。 2、InputPeople関数とShowPeople関数の最後の部分(●の印をしている部分)になぜretutn 0がいらないのでしょうか(原文にはretutn 0の記述がありません)。 3、【while (1)】の部分で、while文の使い方は、「while(条件式){ 繰り返す文;}」のはずですが、なぜ条件式の部分が1なのでしょうか(a > bなどの形ではないのでしょうか)。 4、【while (1)】の部分で、InputPeople関数の引数としてdata[count]がありますが、何を意味しているのかがわかりません。People型の変数dataとint型の変数countを組み合わせてどういう意味合いになるのでしょうか。dataとcountはどういう関係でしょうか。 5、【while (1)】の部分で、count++する意味がわかりません。 6、【while (1)】文内の下記の記述が何を意味しているのかがわかりません。       if (count >= datasize) {       datasize += 10;       data = (People*)realloc(data,sizeof(People) * datasize);      } ここでつまづいて先に進めず困っております。 どうか教えていただきたく、お願い致します。 ●練習問題19 練習問題16(一番下に参考として解答を載せています)の、 「3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。 ただし、データは構造体で記憶することとし、 また、データの入力と表示はそれぞれ専用の関数を作って行うこととする。」 という問題を元に、何人分でも入力できるように改造しなさい。 なお、年齢に-1が入力されれば入力終了とする。 ※配列番号がint型なのでint型の最大値まで扱えれば良い。 ●練習問題19の解答 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { int i,count,datasize; People *data; datasize = 10; data = (People*)malloc(sizeof(People) * datasize); count = 0; while (1) { InputPeople(&data[count]); if (data[count].age == -1) break; count++; if (count >= datasize) { datasize += 10; data = (People*)realloc(data,sizeof(People) * datasize); } } for (i = 0;i < count;i++) { ShowPeople(data[i]); } free(data); return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n");     /*●retutn 0は不要?*/ } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n");     /*●retutn 0は不要?*/ } ●練習問題16の解答 #include <stdio.h> #include <string.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { People data[3]; int i; for (i = 0;i < 3;i++) { InputPeople(&data[i]); } for (i = 0;i < 3;i++) { ShowPeople(data[i]); } return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n"); } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n"); }

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • c 言語初心者です。

    c 言語初心者です。 私は下記の構造体配列をつくりました。 しかしバッファオーバーランが起きてエラーが起きてしまいます。 ヒープ領域に問題があるのかもしれませんが、プログラム上どこに原因があるのかが良くわかりません。 どなたかよろしければ教えていただけないでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include<memory.h> struct s { int i; char name[25]; char huri[25]; char num[23]; }; void touroku(struct s *p); void hyouji(struct s *p); int main(void) { struct s data; touroku( &data ); hyouji( &data ); //data.num *= 1; /* dataはポインタではないのでドット演算子 */ hyouji( &data ); return 0; } /* 構造体のメンバを設定する */ void touroku(struct s *p) { int i=0; for(i=1;i<3;i++) { printf( "25文字以内の名前を入力して下さい\n" ); memset(p[i].name, 0, sizeof(p[i].name)); fgets( p[i].name,sizeof(p[i].name) , stdin ); if(strchr(p[i].name,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].name[strlen(p[i].name)-1]=='\n')//改行解除 { p[i].name[strlen(p[i].name)-1] = '\0'; } printf("25文字以内のふりがなを入力してください\n"); memset(p[i].huri, 0, sizeof(p[i].huri)); fgets(p[i].huri,sizeof(p[i].huri),stdin); if(strchr(p[i].huri,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].huri[strlen(p[i].huri)-1]=='\n')//改行解除 { p[i].huri[strlen(p[i].huri)-1] = '\0'; } printf( "整数を入力して下さい\n" ); memset(p[i].num, 0, sizeof(p[i].num)); fgets(p[i].num,sizeof(p[i].num),stdin ); if(strchr(p[i].num,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].num[strlen(p[i].num)-1]=='\n')//改行解除 { p[i].num[strlen(p[i].num)-1] = '\0'; } } } /* 構造体のメンバを出力する */ void hyouji(struct s *p) { int i=0; for(i=1;i<3;i++) printf("%-8s %3s %3s %d\n" ,p[i].name , p[i].huri , p[i].num , i); puts("----------------------------------------------------------------"); return ; }

  • 教えてください。C言語初心者です。

    #include <stdio.h> int main() { int sentaku,hakoA=0,hakoB,*kiroku[10]; char *name[10]; while (sentaku !=3){ printf("1:新規登録\n"); printf("2:データ確認\n"); printf("3:終了\n"); scanf("%d",&sentaku); switch (sentaku){ case 1: printf("登録する名前を入力してください。---"); scanf("%s",name[hakoA]); printf("記録を入力してください。---"); scanf("%d",&kiroku[hakoA]); printf("登録番号は%d番です。\n",hakoA); hakoA++; printf("登録を終了します。\n"); continue; case 2: if (hakoA==0){ printf("登録されてません\n"); continue; }else{ printf("登録番号を入力して下さい。---"); scanf("%d",&hakoB); printf("%s君で記録は%dです。\n",name[hakoB],kiroku[hakoB]); continue; } case 3: break; default : printf("1~3でお願いします。\n"); continue; } } return 0; } このプログラムはコンパイルされたのですが、実行で入力してるとエラーになってしまうのです。 まだ勉強始めたばかりでちょっとなぜか解らないのです。どこかおかしいところがありましたらご教授いただけると嬉しいです。おねがいします。

  • C言語 初心者です。

    いつもお世話になっています。 またまた困ってます。 以下のソースは一部分を抜粋したものです。 質問内容ですが、現在コンパイルをすると、warningが出てきて、型の互換性がありません。とでてきます。たぶん文字列の長さを読むときがおかしいみたいで、型を色々変えましたが、warningはとれません。どうしたらいいか教えてください。 ちなみに #define NAME 128 /* IDの桁数 */ typedef struct { char name[NAME]; /* 社員番号 */ } syain; size_t str_length(char *str) { size_t length = 0; while (*str++){ length++; } return(length); } void namecheck(syain data[], int syain_num) { int len = 0;/* 社員名の桁数 */ while(1){ printf("社員名:"); scanf("%s", data[syain_num].name); /* 社員名の桁数を変数lenに格納する */ len =(unsigned)str_length(data[syain_num].name); putchar('\n'); if (len < NAME){ break; } } } void syaintouroku(syain data[], int syain_num) { namecheck(data[syain_num].name, syain_num); putchar('\n'); } int main(void) { syain meibo[MAX_NUMBER]; int max_syain = 0; int i; syaintouroku(meibo, max_syain); max_syain++; return (0); }