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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

3回答

1140閲覧

cでの無限ループについて

maitake

総合スコア34

C

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2017/10/22 14:42

今回の質問はcでのwhileを使った無限ループについてです。

#include <stdio.h> int main(void) { char a; while(1){ scanf("%c", &a); if(a != 'z'){ printf("%c\n", a + 1); } else{ printf("a\n"); } } return (0); }

このコード書き実行した際に、「・」が出てきました。全くなぜかわかりません。
なにか意見、解決法を教えていただければ幸いです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

このプログラムを実行して、入力にa+Enterと入れた場合、1回目のループで読まれるのはaですが、その次のループでは、Enterに対応する「改行文字」が読まれます。改行文字の文字コードに+1したものが出力されます。あなたの環境ではそれが「・」と表示されたのでしょう。

az以外なら読み飛ばすべきでは?

C

1 while(1){ 2 scanf("%c", &a); 3 if(a>='a' && a<='z'){ 4 if(a != 'z'){ 5 printf("%c\n", a + 1); 6 } 7 else{ 8 printf("a\n"); 9 } 10 } 11 }

投稿2017/10/22 14:51

編集2017/10/22 15:04
otn

総合スコア84487

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

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

maitake

2017/10/22 23:41

なるほど。わかりやすい解説ありがとうございます
guest

0

問題点

  • 文字コード上でaからzが連続であることを仮定している(まあこれは大きな問題ではない)
  • a + 1の演算をする条件判定がa != 'z'のみで、改行文字を含む、aからz以外の文字の入力を考慮していない(「・」が出た直接的原因)
  • ループを脱出する条件が無い

修正例
https://wandbox.org/permlink/ZjLooVYHmWYtc2lH

投稿2017/10/22 14:55

yumetodo

総合スコア5850

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

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

0

scanfで文字を読み取ったときに、バッファにゴミが残っているためです。
getchar()で空読みすると良いでしょう。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 char a; 6 7 while(1){ 8 scanf("%c", &a); 9 if(a != 'z'){ 10 printf("%c\n", a + 1); 11 } 12 else{ 13 printf("a\n"); 14 } 15 getchar(); 16 } 17 return (0); 18}

投稿2017/10/22 14:50

LouiS0616

総合スコア35660

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

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

yumetodo

2017/10/22 14:56

一文字ずつ入力することは仮定できないのでそれは今回はできないかと思われます
LouiS0616

2017/10/22 14:56

なるほど。確かにそれはそのとおりですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問