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

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

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

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

Q&A

解決済

3回答

2924閲覧

getchar関数とprintf関数

jointeratail

総合スコア12

C

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

0グッド

0クリップ

投稿2019/01/20 05:52

シーザー暗号で13文字シフトさせるプログラムをc言語で書きました。

c

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

I LOVE TERATAIL と入力すると V YBIR GRENGNVY と返ってきます。

ここで疑問になったのが入力の際に、一文字ずつ打ったらその文字が判定されていちいちprintされてしまうのではないかと思っていたのですが、
しっかりまとまってprintされます。
なぜなのでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

getchar() は一文字入力されるたびに呼んだ側に戻ってくるんじゃないのよ。
改行まで読んで内部に蓄えてます。
なのでこのコードだと、改行入力した途端while-loopを一気に何回もぐるぐるぐるっと回ってます。

投稿2019/01/20 06:55

episteme

総合スコア16614

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

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

jointeratail

2019/01/20 08:14

蓄えるところまで理解できました。しかし蓄えてからやったとしてもchar型のcは配列じゃないので、蓄えるたびにcの値がいちいち更新されてしまうのでは思うのですが。。。 最初にプログラムしようと思った時は、char型の配列をつくって配列の一つ一つに入力の値を入れてやるものだと思っていたので、混乱しています。
episteme

2019/01/20 08:19 編集

getchar() が呼ばれるたびに、溜め込まれた文字が"ひとつづつ"返ってきます。
guest

0

ここで疑問になったのが入力の際に、一文字ずつ打ったらその文字が判定されていちいちprintされてしまうのではないかと思っていたのですが、

しっかりまとまってprintされます。
なぜなのでしょうか?

出力がバッファリングされている(1文字ごとに逐一出力するわけではなく、ある程度まとめて行う)からです。これは言語外の仕組みなので、バッファリングをオフにしてプログラムを立ち上げると違った動作になります。

投稿2019/01/20 06:35

maisumakun

総合スコア145184

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

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

jointeratail

2019/01/20 08:10

自分はUbuntuを使っているのですが、Ubuntuでバッファリングをオフにすれば違う動作になるのですね!
pepperleaf

2019/01/20 08:26

C言語に、バッファサイズを 0または、1にする仕組み無かったか? 言語仕様外かも知れないが、あった気がする。 stdin をクローズして、再度、コンソールをバッファサイズ 0で open() すると、0番になるので、getchar()とかの標準入力読込みがそっちになる方法とか。 遠い昔の話なので詳細忘れましたが、、。
jointeratail

2019/01/20 08:31

わからない単語が沢山でてきたのでお勉強してきます。
guest

0

参考情報

  • [C言語]getchar()関数は,1文字入力する毎に処理が走る訳ではない

http://nanoappli.com/blog/archives/3550

...
C言語では標準入力(stdin)が入力された文字をバッファリングしており、getchar()関数を使用する場合は、Enterが押されるまでプログラム側ではそのバッファを認識できないのが原因です。
また、標準出力(stdout)も出力バッファがあるので、出力側が1文字単位ではなく1行纏めて出ていたのもこれが原因です。
...
コンピュータはCPU内部の計算処理に比べると、入出力処理は非常に時間が掛かるため、処理速度向上のためにこのようなバッファが設けられています。
...

  • getchar 標準入力からの1文字入力

http://www.orchid.co.jp/computer/cschool/CREF/getchar.html

...
標準入力がキーボードのときgetchar関数は行単位でバッファリングします(リターンキーを入力するまではgetchar関数は値を返しません)。
...

  • linux上でgetchを使いたい

https://oshiete.goo.ne.jp/qa/3121681.html

投稿2019/01/20 08:09

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問