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

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

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

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

Q&A

解決済

3回答

1089閲覧

c言語プログラムの間違いを教えてください。

t-xxx5

総合スコア6

C

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

0グッド

0クリップ

投稿2021/10/08 06:29

文字0が入力されるまで文字1から文字9までのいずれかを入力し続け、入力された順に各桁に持つような整数を求めて、画面表示するプログラムを作成したいです。(%dを用いて画面表示させる)例:文字6 4 5 2 1 0 と入力すると、整数64521が表示せれる。

以下のようなプログラムを作ったのですが、
実行結果がこんな感じになってしまいます。
2
3
4
0
-1807980

もしよろしければ、どのあたりが間違っているのかを教えていただけると嬉しいです。
よろしくお願いいたします。

#include <stdio.h> int main(void){ int a=0; char b; while(1){ scanf("%c", &b); a += b-'0'; if (b == 48)  break; a = a*10; } printf("%d\n", a); return 0; }

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

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

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

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

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

guest

回答3

0

scanf の書式で %d や %s は空白文字(スペースやタブや改行など) を
読み飛ばすのに、%c は空白文字の読み飛ばしをやってくれません。
そこで " %c" のようにスペースで空白文字の読み飛ばしをやればよいでしょう。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int a = 0; 6 char b; 7 8 while (scanf(" %c", &b) == 1 && b != '0') 9 a = a * 10 + b - '0'; 10 printf("%d\n", a); 11}

数字でない文字は空白文字以外入力しないものとしています。

実行例

text

16 4 5 2 1 0 2645210

投稿2021/10/08 08:21

kazuma-s

総合スコア8224

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

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

0

入力を、改行入れずに、
2340
と入れればちゃんと動くかと思われます

投稿2021/10/08 06:44

y_waiwai

総合スコア87800

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

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

y_waiwai

2021/10/08 06:54

a += b-'0'; のあとに、 printf("# %d %d \n",a,b); ってのを入れたら、プログラムの動きがよく分かるかと。
t-xxx5

2021/10/08 07:33

なるほど そういうプログラムの確かめ方があるんですね! 回答ありがとうございました。 助かりました!
guest

0

ベストアンサー

scanf("%c", &b);

ここで改行コードが入力バッファに取り残されるので,
ループの次の回では改行コードがbに取り込まれて,それが以降の演算に用いられてしまい…

…という話になっていると思われます.


あと,aの更新処理もまずそう.
'0' が入力されるよりも前に10倍してしまうのは間違いかと.

このくらいでどうかな…?

C

1int main(void) 2{ 3 int a = 0; 4 char b; 5 6 while (1) 7 { 8 scanf("%c", &b); 9 10 if( b=='\n' )continue; //改行は無視する 11 if( b=='0' )break; //'0'なら終了 12 if( b<'1' || '9'<b ) //※数字でないものが入力された場合への備え 13 { 14 printf( "Invalid Input\n" ); 15 return 0; 16 } 17 18 a = a * 10 + ( b-'0' ); 19 } 20 printf("%d\n", a); 21 return 0; 22}

投稿2021/10/08 06:38

編集2021/10/08 06:48
fana

総合スコア11708

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

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

t-xxx5

2021/10/08 06:46

回答ありがとうございます。 このプログラムで言う改行コードはどれにあたるのでしょうか? お手数ですが、よろしくお願いいたします。
fana

2021/10/08 06:50

'2' を入力するときに, '2' に続いてエンターキーを押してますよね.きっと. このとき,エンターに相当するのが改行コードです.
fana

2021/10/08 06:58 編集

要は,上記のようにキー入力すると,入力が{'2',改行} という2個になり, scanfがここから1個(先頭側の'2')を取り出しても,まだ改行が残っている. すると,次のscanfではこの改行が取り出される. (「scanf バッファ 改行」みたいな感じで検索すれば,そういう話が見つかるんじゃないかな)
fana

2021/10/08 06:55

で,とりあえず「b が改行 '\n' だったら無視するぜ!」っていうコードを回答に追記した. (scanfに与える書式指定子の側で対処する方法もあると思うけど,私はそっちはよく知らないのでパス)
t-xxx5

2021/10/08 07:26

なるほど 分かりやすい説明ありがとうございました! 助かりました! ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問