ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのgetchar()について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
現在、K&Rの有名なCの教科書をはじめから読み始めています。
getchar()について質問があります。 以下のようなコードを書いて、走らせました。

#include <stdio.h>

main()
{
int c;

c = getchar();
while (c != 5) {
putchar(c);
c = getchar();
}
}


本来ならば、実行後にキーボードに5を入力すればプログラムは終了するはずです。
しかし、5と入力しても5がコピーされるだけで、どうにもなりません。どうすれば、良いのでしょうか?
本来5の代わりに(c != EOF)としていたのですが、うまく行かないので具体的な数値を入れてみました。
OSは、Ubuntu11.10を使っています。

コメント(21)

getchar()の戻り値は文字コードです。
文字「A」の文字コードが65であるように、文字「5」の文字コードは53です。
↓この辺を参照。
http://charset.7jp.net/sjis.html

そのため正しくは while(c != 53) です。

このくらいの質問なら「トピック作るほどでもない質問」トピへどうぞ。
TaKo.t.Maeda様

うおーすばらしい。助かりました。

>このくらいの質問なら「トピック作るほどでもない質問」トピへどうぞ。
今後はそうします。

またまた初心者的な質問ですが、while(c != EOF)とした場合、何をキーボードで入力すれば止まるのですか?

−1と入力してもコピーされて返されるだけです。
> 2
^Z (ctrl+Z) か^D (ctrl+D)。環境によって違う。
例えば、入力された文字数を数えるプログラムとして、以下のようなものを考えます:

#include <stdio.h>

main()
{
long nc;

nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}

^Z (ctrl+Z) か^D (ctrl+D)だと、単に実行を中断するだけで、正しい実行結果(文字数)は出てきません。調べたところ、EOFの値はこのPCで確かに−1のようなのですが、入力したところで結果が出てこないのです。
^D でちゃんと返ってきましたけど。
実行環境は Win7 + Cygwin

$./a.exe
abcde
6

(eの後の改行も含めて6文字)
意気込みは買いますが、K&R は、さすがにこのレベルから始めないといけない初心者の独学には、向いてないと思います。あれは最低限、コンピュータの使い方を知っていて、かつ何か一つ以上別の言語をマスターしている人のためのものです。

初心者向けおすすめ情報
http://mixi.jp/view_bbs.pl?id=58130668&comm_id=2880

上のトピの2番で紹介されている柴田望洋さんの本は、私は使ったことありませんけど、そこそこ評判はいいみたいですね。

http://www.amazon.co.jp/%E6%96%B0%E7%89%88-%E6%98%8E%E8%A7%A3C%E8%A8%80%E8%AA%9E-%E5%85%A5%E9%96%80%E7%B7%A8-%E6%9F%B4%E7%94%B0%E6%9C%9B%E6%B4%8B/dp/4797327928
私はプログラミングは素人に近いんですが、

while(c != 53)
を
while(c != '5')

にした方が分かりやすいんじゃないかと思うんですが、あまりしませんか?
まぁ '5' にすべきでしょうね。
わかってる人にはそっちのほうがずっとわかりやすい。

でも、質問者さんに 『文字としての '5' は数値としての 5 と違うよ』っていうことをわかってもらうために
あえてそういう表現にしたんじゃないかと。
> みのるさん
なるほど、ありがとうございます。
ここに投稿してくださった皆さん、多くのアドバイスありがとうございます。
私のプログラミング学習歴といえば、かなり前にC++の主だったことを大体ひと通りやった、という程度です。C++を知っておればCは必要ないかと思ったのですが、相互の理解が深まるのではないかと思い、Cを始めてみたわけです。
上で推薦されている柴田氏の本は、第一版なら私も持っていますが、なんとなくK&Rに挑戦してみました(見た目の薄さなどから)が、難しいですね。しかし、難しいながらも少しは楽しいものです。もうしばらく、この本を続けてみようと思います。
0x35だと、ぱっと見ただけでASCIIの'5'だと分かりやすい
> 11

ミニコン畑で育った人だと 065 の方が分かり易かったりするかも。
キーボードからEOFを入力する方法ってのは、言語がC++でもCでもJAVAでも全部同じですよ。OSによって違うだけ。
UNIX系は^D、DOS/Windowsは^Z、メインフレームの端末だとまた違う。MELCOMだと機能-Eだったかし??

K&Rはコマンドラインでの操作は一通りできることが常識の時代に書かれた本なので、カレー太郎さんがK&Rをやるならもっとたくさん予備知識を仕入れないと難しいと思いますよ。
windows上のcygwin bashなら、C-dでいいんじゃないの?
cygwinだと^Dなんだろうとおもうけど、環境を消しちゃったので確認できず。
^Z、しかも行頭で打たないと EOF にはならないみたいな雰囲気ですね、cygwin の bash。何か設定があるのかも知れないけど。
NTEmacs の shell-mode の cygwin の bash だと、行頭でなくても ^Z(^Q^Z) で認識しますね。5 の EUR/JPY さんは cygwinだけど ^D で出来たって書いてるし、まあ環境によっていろいろ違うということでしょう。

あと今更だけど、「EOFを入力」してるんじゃなくて、「入力はこれで終わりだよ」ということをシステムに知らせている、のですよね( ...Unix系の ^D ってのは Ascii の EOT (End of Transmission) 通信制御コードを流用してる?)。getchar() にしても「EOF文字」を返すわけではありません(EOFの値は8bitの文字コードでは表現できない→EOFは文字ではない)し。
> 17
> あと今更だけど、「EOFを入力」してるんじゃなくて、「入力はこれで終わりだよ」ということをシステムに知らせている、のですよね

システムというか、手元のターミナルエミュレーターに伝えてる。
ローカルのホストaのターミナルを使ってリモートのホストbのシェルを使っている場合、
文字としてのC-dはホストbには流れない。
ちょっと確認してみました。
UNIXのシェルだと ^Dを打つとEOFになる。行頭に限る(調べた限りでは)。
Windowsのコマンドプロンプトだと ^Zと行頭で打ってさらにエンターを押す必要がある。
行頭でなくても2発連続で入力すればいいような
UNIXの場合ttyディシプリンがどれか、とかでいろいろ変わってきそう。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。