プログラミング言語C第2版(B.W.カーニハン/D.M.リッチー著)という本が良いといわれて、勉強しているのですが、最初のほうでEOFを含んでいるプログラム例をそのまま記述しても上手くいかないのですが、同じ本をお持ちの方どうしてなのかわかりませんか。教えてください。
・上手くいかない,というのはどのような状況なのですか?
(コンパイルエラー,予想されたように出力されないetc.)
・また,どのプログラムを記述したのでしょう。
(1.5.1 ファイルの複写の最初のプログラム(p.20) etc.)
これらの情報が無いと,教えようがありませんよ。
このような掲示板や,同じ様な役割のMailing List等では,「上手くいかない」は禁句だと思ってください。
「上手くいく」がどういうことか,説明がなされないと相手にはわからないからです。
[参考] 質問の仕方に関して
http://www.hyuki.com/writing/techask.html
↑これはMailing Listでのマナーですが,掲示板でもほぼそのまま使えます。
本は待ってないけど。
コンパイルエラーだとすると、もしかして
EOF は表記上存在するだけで、ソースに書かなくても良いのでは?
ご丁寧に行番号まで振ってもいても行番号は書いちゃいけませんし。
それともファイル処理で_eof絡みかな?
> EOF は表記上存在するだけで、ソースに書かなくても良いのでは?
stdio.hで定義されるEOFというマクロシンボルを使うソースがファイルに存在します。
e.g.) while ((c = getchar()) != EOF)
> それともファイル処理で_eof絡みかな?
そんな非ANSIな関数,プログラミング言語Cでは扱っていません。
#第8章を除く。
質問があいまいでした。ごめんなさい。YuOさんご指摘ありがとうございました。勉強になりました。
1.5.3 行数のカウント(p.24)や1.6 配列(p.27)のプログラムにはいずれもwhile((c = getchar()) != EOF)が含まれており、コンパイルはされるのですが、プログラムを実行させて黒い画面になり、キーボードのどれを押しても押した文字が記述されるだけなのです。結果を出力するために何か操作をしなければならないのでしょうか。
これは,C言語ではなく,コンソールに関する話ですね。
WindowsのConsole(MS-DOSプロンプトやコマンドプロンプト)やMS-DOSでは,Ctrl+ZがEOF入力になります。
他のOSであれば他のキーになると思います。
YuOさん回答ありがとうございます。Ctrl+ZによってPress anykey to continueが表示され終了できるのはわかったのですが、前述のプログラムはEOFでない入力時に改行'\n'をカウントして行数を表示するプログラムであったと思うのですが、キーボードのどれを押しても押した文字が記述されるだけで結果が表示されません。なにか操作をしないといけないのでしょうか。
Press anykey to continue
と表示される前に行数が表示されていませんか?
プログラムを実行すると真っ黒な画面になり、そこに文字を入力したり、リターンを押して改行した後に、Ctrl+Zを押すと、最後に入力した文字の後にPress anykey to continueが表示されるだけです。プログラムは何度確認しても本の通りに記述しています。
プログラムは,printfの行を実行していますか?
IDEでブレイクポイントを設定して実行すればチェック可能です。
あと,コンソールから直接起動した場合はどのようになりますか?
初心者なのでやり方がイマイチわかりません。とりあえず、main(){・・・}のあとにカーソルをあわせて、カーソル前までのデバックを実行したところ、別のフレームにシンボルnl、値4などのようにそれらしい値は表示されいます。黒い画面には何も結果が表示されません。例題どおりのプログラムを記述してprintfの行を実行しないようなことが起こったりするのですかね。ん〜ん訳がわからないです(T_T)。
うーん,p.24のプログラムを実際に入力して実行してみたのですが,
ちゃんと結果が表示されていますよ。
[コンパイラ]
・Microsoft Visual C++ 5.0 (with Service Pack 3)
・Borland C++ 5.5.1 for Windows
[OS]
・Microsoft Windows NT 4.0 (with Service Pack 6a - NEC)
実際にコンパイルしているプログラムをCopy & Pasteしてここに書き込んでみてください。
何度も質問してすみません。
こちらは
[コンパイラ]
・Microsoft Visual C++ 6.0 (with Service Pack 2)
[OS]
・Microsoft Windows 98
#include <stdio.h>
main()
{
int c, nl;
nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n')
++nl;
printf ("%d\n", nl);
}
追記
デバックをおこなった後に
thisというところに
「CXX0017:Error:シンボル”this”が見つかりません」
デバックというところに
「'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。」と言うメッセージが表示されています。何か関係あるのでしょうか。
VisualC++ 6.0 で亜衣さんのソースをそのままコンパイルして実行
しましたがちゃんと動作しました.
a[ENTER]
b[ENTER]
c[ENTER]
Ctrl+Z[ENTER]
3 <- 行数が表示された
Press any key to continue
Ctrl+Z(コントロールZ) の次に 3 と行数が表示されました.
プログラムはメニューの ビルド/実行 をクリックして実行します.
ショートカットは Ctrl+F5 です.
'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました... という
メッセージは今回の件には関係ありません.
NoiNoiといいます。
#include <stdio.h>
main()
{
int c;
int nl=0;
while ((c = getchar()) != 'a')
{
if (c == '\n'){
nl++;
printf ("[ENTER]\n");
}else{
printf ("[%d]\n", c);
}
}
printf ("%d\n", nl);
}
これでどうでしょうか?
使用方法としましては
Aボタンで終了というこで、、、
で、よくわからないことがひとつあるのですが、、、、
Ctrl + C
を押すとバグリマス。
それって僕だけ?
私が記述したソースを他の方がそのままコンパイルして実行すると正常に動作するってことはますますわけがわからなくなりました。私自身VC++の扱い方がイマイチ把握していないこともあるので操作方法自体がまちがっているのでしょか?でも前記した本の最初のプログラム(温度換算プログラム)は正常に動作しました。EOFがでてきてから本のとおりのプログラムを記述してもそのとおりに動作しません。
ソースファイルにプログラムを記述しているんですがそれでよろしいのでしょうか(cpp)。また、何かのファイルと同じフォルダに保存しないといけないとかあるのでしょうか。
その他にも何かお気づきの点がありましたら助言していただけないでしょうか
このプログラムにこだわらず先に進んだ方がいいのでしょかね?
とりあえず,拡張子はcにした方がよいですね。
#コンパイルが早くなる
とりあえず,先に進んでもいいと思いますよ。
わかりました。それでは先に進みたいとおもいます。
みなさんいろいろ教えていただきありがとうございました。
とりあえず解決です。
ツイート | ![]() |