C言語を勉強しているのですが
【putchar】というのがあるとおもうのですが
一文字しか出力できないんですよね?
な、なんの意味があるのでしょうか....
puts("")やprintf("")でも一文字ってできますよね?
具体的にputcharとはいつ使うのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
こんにちは。
puts()で1文字つ出力するためには1文字の文字列を与える必要が有ります。
それは最低でもchar foo[2];ですので、ちょっと面倒な時があります。
printf("%c")は、書式解析する必要があるので重いです。
1文字しか出力しないことが分かっている時であれば、重たい処理したくない場合はあります。
投稿2016/11/30 10:01
総合スコア23274
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総合スコア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
総合スコア18404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

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
総合スコア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総合スコア1722
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/30 10:12
2016/11/30 10:16
2016/11/30 12:24
2016/11/30 12:39 編集
2016/11/30 13:02
2016/12/05 09:53 編集
2016/12/05 09:56