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

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

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

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

Q&A

5回答

5695閲覧

putcharの必要性について

Sprinkle_Egg

総合スコア14

C

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

0グッド

2クリップ

投稿2016/11/30 09:56

C言語を勉強しているのですが
putchar】というのがあるとおもうのですが
一文字しか出力できないんですよね?
な、なんの意味があるのでしょうか....
puts("")やprintf("")でも一文字ってできますよね?

具体的にputcharとはいつ使うのでしょうか?

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

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

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

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

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

guest

回答5

0

こんにちは。

puts()で1文字つ出力するためには1文字の文字列を与える必要が有ります。
それは最低でもchar foo[2];ですので、ちょっと面倒な時があります。

printf("%c")は、書式解析する必要があるので重いです。
1文字しか出力しないことが分かっている時であれば、重たい処理したくない場合はあります。

投稿2016/11/30 10:01

Chironian

総合スコア23272

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

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

Sprinkle_Egg

2016/11/30 10:12

すみません初心者なもので.... puts("A") putchar('A') 同じではないのでしょうか?
Chironian

2016/11/30 10:16

それは同じですね。 getchar()で受け取って、何か処理してputchar()することはよくあります。 その代りに、getchar()で受け取った文字をputs()で出力することを考えてみて下さい。
Sprinkle_Egg

2016/11/30 12:24

getchar自体があまり理解できてませんでした.... 勉強不足です... いろいろ調べてみたのですが、自分なりの解釈として getcharはあくまでもユーザーから【一文字だけ】受け取る つまり例えば【abc】と入力しても最初のaしか判定されないということでしょうか?
Chironian

2016/11/30 12:39 編集

1回しか呼ばなければその通りです。 getchar()は1文字づつ受け取りますので、3文字受け取るためには、3回呼び出す必要が有ります。 ところで、実際の動きを実際に見てみるのが一番早いですよ。 プログラミングは頭であれこれ考えていても始まらないのが現実です。 あれこれやってみて思ったのと同じ動きにならなかったら、「Sprinkle_Eggさんが期待する動作」と「実際の動作」の相違を示して何故異なるのかをここで尋ねると、きっと多くの方が回答してくれると思います。
Sprinkle_Egg

2016/11/30 13:02

なるほど.... ありがとうございます 次からはもっと詳しく書きます!
Eki

2016/12/05 09:53 編集

ところで puts("A") は改行を出力しますが、 putchar('A') は改行を出力しません。
Chironian

2016/12/05 09:56

あう。本当ですね。Ekiさん指摘ありがとうです。 ということで、Sprinkle_Eggさん、puts("A");とputchar('A');の動作は異なります。 前者は、"A\n"が出力され、後者は"A"のみ出力されます。
guest

0

私はputchar()ではなくputc()派なんですが、改行'\n'出力にはよく使います。理由は簡単で「軽くて間違いにくい」です。例えば・・・

c

1 for( int i= 0; i < siz; i++){ 2 for( int j= 0; j < siz; j++){ 3 printf("%2.4f ",m[i][j]); 4 } 5 putc('\n',stdout); // siz分出力したら改行 6 }

のような場合、ここにputs("\n")やprintf("\n")を書こうとは思いません。まぁ“一文字出力なのに文字列使うのか?”的な考えもありますが・・・printf()重いしw
参考までに標準ライブラリの生い立ちについては、下記が参考になります。
標準Cライブラリ

投稿2016/12/02 23:21

編集2016/12/03 01:15
cateye

総合スコア6851

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

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

0

putchar,putcのような文字(またはbyte)の出力関数はテキスト出力の基本機能として設計されているからという説明もできます。

puts,fputs,printf,fprintf等々はCそのもので実装されていることが普通です。例えばfputsの実装を想像してみてください。その実装は「1文字出力するputcのような関数/マクロ」を基本機能としてNUL文字に到達するまで1文字ずつ出力していると考えるとputchar/putcのような文字を出力する機能の存在意義があると納得できるのではないでしょうか。

このように基本機能を用いてだんだんと高機能なものを作り上げる段階的なソフトウェア設計はどの言語でもどのライブラリーでも普通に行われます。非常に多くの機能を持つライブラリーをDRY原則に従って設計すれば自然にそうなると思います。大抵の場合基本機能は仕様と実装が最も単純なのでそれを利用可能な場面であればより高度な機能を使うよりも効率がよく、低レベルなことができる(※)ことが多いです(他の回答者の方がおっしゃっているとおりです)。そのため高機能の関数だけでなく基本機能の関数も提供されているのだと思います。

※:低レベルなことができる
majiponiさんが最後に上げておられる例です。

C

1//実際の仕様や実装を正確に記したものではありません。(本当の戻り値はintです) 2//単に説明の例として挙げているだけなので詳細がこのとおりかどうかはあまり気にしないでください。 3 4void fputs(const char *cp, FILE *fp) { 5 char c; 6 while ((c = *cp++)) { 7 putc(c, fp); 8 } 9} 10 11void putc(int c, FILE *fp) { 12 if (fp->buffer_position >= fp->buffer_size) { 13 fpのバッファをファイルへ吐き出す 14 fp->buffer_position = 0; 15 } 16 fp->buffer[fp->buffer_position++] = (char)c; 17}

投稿2016/12/02 15:49

KSwordOfHaste

総合スコア18392

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

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

majiponi

2016/12/03 00:26

あー、私が言ったのは難しいことではなく、putsだと強制改行だよね、ヌル文字出力できないよね、そんな程度のことです…(汗)。
guest

0

putcharは1文字ずつ処理した方が楽な場合に重宝します。

C

1#include <stdio.h> 2#include <ctype.h> 3 4int main(int argc, char **argv) 5{ 6 char *filename; 7 FILE *fp; 8 int ch; 9 10 if (argc < 2) { 11 return 1; 12 } 13 14 filename = argv[1]; 15 16 if ((fp = fopen(filename, "r")) == NULL) { 17 perror(filename); 18 return 2; 19 } 20 21 while ((ch = fgetc(fp)) != EOF) { 22 if (isprint(ch)) { 23 putchar(ch); 24 } 25 else { 26 putchar('.'); 27 } 28 } 29 30 fclose(fp); 31 return 0; 32}

投稿2016/12/04 02:42

naomi3

総合スコア1105

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

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

0

Chironianさんの回答で申し分ないですが、少し補足。

ライブラリとして、あることを実現するためのインターフェース(関数)は、1つだけ提供すべきである、という考え方がCの有名な本に記載されています。つまり今回の例で言えば、printfだけあれば十分、ということで、その点では質問者さんの疑問は最もです。
しかし、標準ライブラリは歴史的な経緯もあり、同じ機能を実現するために複数のインターフェースを用意していることがあります。今回ではputcharですね。それには歴史的経緯だけでなく、実践編な理由もあります。
1つ目は、動作の軽量さ。printfはどちらかというとメモリや時間を必要とするので、きびきび動くものを書くときにputcharは重宝します。
2つ目は、読みやすさ。1文字表示はよく使われる機能ですが、そのために書式指定するのは、正直面倒です。簡潔に書ける方法があるほうが便利です。
という理由で、putcharは現在でも生き残っています。

補足:実はputcharにできて、puts関数にできないことがあります。puts関数は、最後に何をしますか? もう1つ、ヒントだけをば。
ヒント:リダイレクト、バイナリモード、ヌル文字

投稿2016/11/30 14:26

編集2016/12/01 00:14
majiponi

総合スコア1720

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問