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

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

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

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

Q&A

解決済

4回答

597閲覧

出力結果が上手くいかない

NB16

総合スコア14

C

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

0グッド

0クリップ

投稿2019/11/05 13:02

前提・実現したいこと

プログラミング初心者です。
キーボードから文字を一つ入れると、その文字コードが表示されるようなプログラムを制作しています。
一文字を出力するとその文字の文字コードが出力され、ピリオドを入力すると終了するプログラムです。

処理結果

半角文字を入力してください ピリオドを入れると終わります A 文字コードは10である A 文字コードは65である 文字コードは10である b 文字コードは98である 文字コードは10である

問題

上部をみればわかるように最初の入力は文字と文字コードが一致していなく、2回目からの入力は”文字コードは65である”の後に”文字コードは10である”がなぜかついてくるのです。また、最初の入力でピリオドを入力しても”文字コードは10である”と出力されます。(下に記載)
原因は一体なんなのでしょうか。教えてくださいお願いします。

半角文字を入力してください ピリオドを入れると終わります . 文字コードは10である . 終了

ソースは以下のものです

c

1#include <stdio.h> 2 3int main(void){ 4 5 char a; 6 7 printf("半角文字を入力してください\n"); 8 printf("ピリオドを入れると終わります\n"); 9 a = getchar(); //一文字の入力 10 11 while((a = getchar()) != '.'){ //コンマが入力されない限りループ 12 printf("文字コードは%dである\n",a); //文字コード出力 13 printf("\n"); 14 } 15 return 0; 16}

補足

コードはvisual studio code
macbookのターミナルを使ってます。

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

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

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

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

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

guest

回答4

0

解決方法

aにスペースを代入し、rewind(stdin)よって標準入力から読んだ内容を初期化して初めから読み直すようにした。

ソース

c

1#include <stdio.h> 2 3int main(void){ 4 5 char a = ' '; 6 7 while(a != '.'){ //コンマが入力されない限りループ 8 printf("半角文字を入力してください\n"); 9 printf("ピリオドを入れると終わります\n"); 10 a = getchar(); 11 rewind(stdin); //標準入力から読んだ内容を初期化して初めから読み直す 12 printf("%cの文字コードは%dである\n",a,a); //文字コード出力 13 printf("+1した時の文字は%c,文字コードは%dである\n",a+1,a+1); 14 printf("-1した時の文字は%c,文字コードは%dである\n",a-1,a-1); 15 printf("\n"); 16 17 18 } 19 return 0; 20}

出力結果

半角文字を入力してください ピリオドを入れると終わります A Aの文字コードは65である +1した時の文字はB,文字コードは66である -1した時の文字は@,文字コードは64である 半角文字を入力してください ピリオドを入れると終わります B Bの文字コードは66である +1した時の文字はC,文字コードは67である -1した時の文字はA,文字コードは65である 半角文字を入力してください ピリオドを入れると終わります C Cの文字コードは67である +1した時の文字はD,文字コードは68である -1した時の文字はB,文字コードは66である 半角文字を入力してください ピリオドを入れると終わります . .の文字コードは46である +1した時の文字は/,文字コードは47である -1した時の文字は-,文字コードは45である

投稿2019/11/06 06:48

NB16

総合スコア14

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

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

thkana

2019/11/06 10:56

例えば abc[return]なんて入力したときの反応はそれでいいのかしら?
guest

0

ベストアンサー

原因はなにか...と言われると、あなたの書いたプログラムがコンピュータにそうしなさい、と命令しているからなんですけどね。

C

11: a = getchar(); //一文字の入力 22: while((a = getchar()) != '.'){ //コンマが入力されない限りループ 33: printf("文字コードは%dである\n",a); //文字コード出力 44: printf("\n"); 5 }

1:で、aにgetchar()で一文字入力を拾います。
キーボードからA[Enter]と打ったのなら、aには’A'の文字コード65が入るでしょう。
そして、2:ではまたgetchar()で一文字を拾ってaに代入しています。つまり、キーボードから入力した2文字目のデータですね。あなたは、A[Enter]と打ったのですから、[Enter]に対応するコードが得られました。
そこでやっと3:に進んで文字コードの表示を行っているわけです。aの値はEnterキーのコードになっています。'A'の文字コードが表示されることはありません。

理屈はそれだけです。最初に'.'を入れたときもネタは同じ。1:でaに入れた一文字は使われる間もなく2:で書き換えられてしまっています。

投稿2019/11/05 14:43

thkana

総合スコア7639

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

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

NB16

2019/11/05 15:35

試しに1:のgetchar()を消して試してみたのですが、結果は一番最初にreturnの文字コード10だけが出力される問題は解決しましたが、やはり、同じようにreturnの文字コード10が出力されました。。。 出力結果 半角文字を入力してください ピリオドを入れると終わります A 文字コードは65である 文字コードは10である B 文字コードは66である 文字コードは10である C 文字コードは67である 文字コードは10である . 終わり
thkana

2019/11/05 15:39

あなたがAに続いてreturn(改行)文字を入力しているのですから、当然そうなります。 > キーボードから文字を一つ入れると、その文字コードが表示されるようなプログラムを制作しています。 というプログラムが、文字を2つ入れたらそれぞれの文字コードを表示しているわけですが、何が問題なのでしょう。
NB16

2019/11/06 04:28

そしたらreturn文字を入力されないようにするにはどうすればいいのでしょうか?
NB16

2019/11/06 06:42

すいません、解決しました。丁寧にありがとうございます。 とてもためになりました。
guest

0

a = getchar(); //一文字の入力

このときに入力された文字はプリントアウトされずに捨てられている、というのはわかるでしょうか

投稿2019/11/05 13:13

y_waiwai

総合スコア87774

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

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

NB16

2019/11/05 13:46

回答ありがとうございます。 なぜ、捨てられているのでしょうか? また、どのようにすれば上手くいくのでしょうか?
y_waiwai

2019/11/05 21:03

この命令のあとになにが実行されてるのか見ましょう。
y_waiwai

2019/11/05 23:40

> while((a = getchar()) != '.'){ //コンマが入力されない限りループ aにgetchar()の結果が代入されてます。 最初のaのナカミのデータは上書きされて消えてしまいます
guest

0

文字を入力するときに、
"A" と打ったあと、Enterキー (Macだと、違った?)を打ってませんか?
Enterキーのコードは、0x0A(10進で 10)です。

これが出力されています。


[追記]
最初の入力が使われずに捨てられています。
例えば、こんな感じに変更?

C

1 while(a != '.'){ //コンマが入力されない限りループ 2 printf("文字コードは%dである\n",a); //文字コード出力 3 printf("\n"); 4 a = getchar(); 5 }

投稿2019/11/05 13:05

編集2019/11/05 23:11
pepperleaf

総合スコア6383

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

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

NB16

2019/11/05 13:44

回答ありがとうございます。 Macだとreturnキーです。押してます。 しかし、なぜこのような現象がおこっているのでしょうか? また、最初の出力がこのreturnキーの10だけが出力されているのはなぜでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問