質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3023閲覧

getchar()が一部無視されたように動いてしまいます。

tenetenne

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/01/25 12:03

前提・実現したいこと

C言語で、テキストデータから単語を読み込み、ユーザに提示するプログラムをつくっています。コンパイルは通りますが、実行するとgetchar()が一部無視されているように動いてしまいます。
読み込んだデータは文字列の配列の0行目に格納します。そのあとgetchar()でユーザにyかnの入力をさせ、nの場合はその文字列を配列のi行目にいれ、iをカウントアップします。最後に配列の1行目から順に単語を描画します。

発生している問題・エラーメッセージ

inchoate y or n : n この単語はまだ覚えてないですね。 profligacy y or n : austerity y or n : n この単語はまだ覚えてないですね。 opprobrium y or n : apostates y or n : n この単語はまだ覚えてないですね。 cat y or n : ----- まだ覚えてない単語は以下の通りです ----- inchoate austerity apostates

読み込むファイル(English1_1.txt)

inchoate profligacy austerity opprobrium apostates cat

該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3 4// 定数宣言 ------------------------------------------------ 5#define MAX_NAME 32 // 1行の最大文字数 6 7// プロトタイプ宣言 ---------------------------------------- 8FILE *FileOpen(FILE *fp); 9void ShowWordlist(char wordlist[MAX_NAME][MAX_NAME]); 10 11// メイン関数 ---------------------------------------------- 12int main(void) 13{ 14 FILE *fp; 15 char wordlist1[MAX_NAME][MAX_NAME] = {}; 16 char answer; 17 int i = 1; 18 char fname[] = "English1_1.txt"; 19 char k; 20 21 fp = fopen(fname, "r"); 22 23 while(fgets(wordlist1[0], MAX_NAME, fp) != 0){ // 読み込む単語がなくなるまで読み込む 24 printf("%s\ny or n : ", wordlist1[0]); 25 answer = getchar(); 26 27 /***** yes と no で場合分けする *****/ 28 if(answer == 'y') printf("この単語はもう覚えてますね。\n\n"); 29 if(answer == 'n'){ 30 printf("この単語はまだ覚えてないですね。\n\n"); 31 strcpy(wordlist1[i], wordlist1[0]); 32 i++; 33 } 34 } 35 36 fclose(fp); 37 38 /***** noを選択したものを描画 *****/ 39 printf("----- まだ覚えてない単語は以下の通りです -----\n"); 40 for(i = 1; wordlist1[i][0] != '\0'; i++) printf("%s\n", wordlist1[i]); 41 42 printf("\n"); 43 44 return 0; 45}

試したこと

scanfやfscanfを使って書き直してみても同じ結果でした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2018/01/25 13:23

「実行するとgetchar()が一部無視されているように動いてしまいます」をもう少し具体的に記述してもらえませんか?決まったパターンで無視するのか、それともランダムに無視されるのかなど、現象がはっきりすると他の方からもアドバイスが集まりやすいと思います。
guest

回答2

0

ベストアンサー

改行が次の処理に持ち越されないよう入力バッファをクリアして下さい。
つrewind(stdin)

投稿2018/01/25 13:23

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tenetenne

2018/01/25 14:32

回答ありがとうございます。解決できました。 rewindという関数知りませんでした。勉強になりました。
guest

0

C

1 char answer;

の部分を

C

1 int answer;

にしてみてはどうでしょう。

投稿2018/01/25 12:32

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tenetenne

2018/01/25 12:56

回答ありがとうございます。 intに変えて実行しなおしてみましたが、結果は変わりませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問