• ベストアンサー

本の内容とアドバイスの違い

こんばんわ。今Cの入門の書籍を読んでいるのですがそこに載っているコードをテキストエディタに書いて、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1607365で教えていただいたと通りにコンパイルしアップロードして権限を与え、アクセスしたのですが、エラーが出ます。 原因は書籍のコード中に\r\nが入っていないということが原因であるということがわかりました。 \r\nとは何を意味するのか教えてください。 またなぜ書籍には\r\nが記載されていなかったのでしょうか?何か意味があって記載していないのかと疑問に思いました。ご存知の方おられましたら是非教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.5

> つまり、Fire Foxのようなcgiではないプログラムと > cgiプログラムでは書き方(ここでは改行コードのこと)が > 違うという解釈をしてよろしいのでしょうか? > 大きな誤解があります。 改行コードの問題ではありません。 あなたは、アプリケーションプログラムとは何か、オペレーティングシステムとはなにかということから知る必要があるように思います。 > それとcgiじゃないプログラムとはどのようなものが > あるんでしょうか? CGIに対応していないプログラムの方が大多数です。WindowsやMacOSの上で普段あなたが使っているアプリケーションはほぼ100%がCGIに対応していません。 > perlの場合は全部cgi見たいな感覚でかじっていたので > コンパイル言語とインタープリタ言語の違いが飲み込めずに > 苦労しています。 perlはCGIのための言語ではありません。インタープリタ言語であることは確かにそのとおりですが、CGIに対応するためにはCGIの規約にしたがった書き方をしなければなりません。また、perlとCの違いはCGIに対応するという点において、コンパイル言語とインタープリタ言語の違い以上の違いはありません。つまり、CGIの規約に従って記述すればCでもperlでもそれ以外の言語でもCGIを作成することは可能です。(ただし、言語仕様上CGIの規約に従うことができない言語は除きます。例:Visual basicなどの標準入出力インターフェースのない言語) > Internet Explorerの拡張子はexeになっていますが、 > これはcgiの書き方で書かれているんですか? Internet ExplorerはCGIに対応していません。 CGIはウェブサーバとCGI対応プログラムの間でやり取りするためのものですから、通常のアプリケーションは対応する必要がありません。 ここまで読んで多分あなたは「Internet ExplorerはCGIの結果を表示できるじゃないか」と言うかもしれませんが、Internet ExplorerはウェブサーバがHTTPというプロトコルで送信してきたデータ(通常はHTMLテキストや画像ファイルなど)を表示しているだけで、そのウェブサーバがそのデータを作成する際にどういう動作をしているかについてはなんら関知していません。 あくまでもCGIは、ウェブサーバとCGI対応プログラムの間でデータをやり取りするための規格です。

その他の回答 (5)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.6

#5で用語について説明していませんが、参考URLにあげたような用語辞典などを参照してご自身で確認していただくべきかと思います。 @Nifty:辞書 http://www.nifty.com/dictionary/ @IT Insider's Computer Dictionary http://www.atmarkit.co.jp/icd/index.html IT用語辞典e-Words http://e-words.jp/ あなたは、以前の質問でもいろいろと質問をされていて、高校生だということですね。若いということはそれだけまだまだ学ぶにあたって時間的な余裕があるということですから、がんばって。

smalldeveloper
質問者

お礼

ご回答くださった皆様本当にありがとうございます。OSなどは判ったような気になっていて実際には理解できていなかったりするので、もうすこし基礎を学びたいと思います。本当にありがとうございました。

回答No.4

No.3 訂正です。 '\f' は、フォームフィード(改ページ)ですね。 '\n' で、復帰改行(0x0d)ということで、OKのようです。 ただ、Windows 環境のテキストモードでは、確かに、'\n' ひと文字(の扱い)で、0x0d 0x0a のペアに展開される処理系が多いのですね。 おそらく、もともとのテキストは、Windows 用だったので、'\n' ひとつですませていたのではないかなと思います。 '\n' すらなかった……というのであれば、単なるミスでしょうけど。 失礼しました。 ちなみに、私の場合、明示的に cr+lf を出力させるときには、直接文字コードで、 "\x0d\x0a" という標記にしています。 単なる改行は、"\n" ですませますが。

回答No.3

C言語の規約上、 '\n' で、「その処理系における適切な改行」をするはずですが。 その上で、詳しく書くのであれば、mac は、'\r' (文字コードは、0x0d) Unix 系は、'\f' (ラインフィード・文字コードは、0x0a) Windows は、"\r\f" (文字コードは、0x0d 0x0a) これらの、OSの違いを吸収するために、'\n' は、それだけで、(その環境における)改行になるはずですが。 なので、特別に、異なった環境に対応するのでなけれ ば、'\n' でOKです。 (ちなみに、Windows 上で、 GCC を使うのは、設定によってはこのパターンになります) ただし、これが、実際にはいろいろなコードに展開されるため、ファイルを、「テキストモード」で扱う必要があったりしますが。

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.2

前回の#2,#5 #6で回答したrentaheroです。 > \r\nとは何を意味するのか教えてください。 \rとは、制御文字0x0d(ASCIIコード14)です。意味は#1氏の回答のとおり、キャリッジリターン(Carriage Return 略称CR)です。日本語では復帰といいます。もともとタイプライターの紙を左端まで戻すことをいいます。 \nとは、制御文字0x0a(ASCIIコード10)です。意味は同様にラインフィード(Line Feed 略称LF)です。日本語では改行または行送りといいます。もともとタイプライターで次の行に紙を送ることをいいます。 #1氏の回答にあるように、 Windowsのテキストファイルでは\r\nで復帰改行を表します。 Macintoshのテキストファイルでは\rで復帰改行を表します。 UNIXのテキストファイルでは\nで復帰改行を表します。 このように復帰改行は環境によってばらばらなので、復帰改行文字として、ニューライン(New Line 略称NL)としてまとめて表現されます。 CGIの規格書としてまとめられているのは、CGI/1.1(rfc3875)です。 rfc3875:http://www.ietf.org/rfc/rfc3875.txt 上記rfc3875の7章システム仕様(System Specifications) において、「NLはLFであらわされるが、サーバーはCR LFも同様に受け入れる"べきである"(The newline(NL) sequense is LF; servers SHOULD also accept CR LF as a newline.)」と書いてあります。 簡単にCGI応答(CGI Response)の形式を書くと、 ヘッダフィールド+<NL> (必要な分だけ繰り返し) 空行(行頭に<NL>のみ) メッセージボディ(本文) となります。 前の質問の回答#2であげたもので説明すると、 printf("Content-Type: text/plain\r\n");←ヘッダフィールド+<NL> printf("\r\n");←空行 printf("ABCDEFG");←メッセージボディ となるわけです。 CGI応答では、形式が間違っていると当然のことながら動作しません。改行(NL:\r\nまたは\n)がないというのは形式が間違っていることなので、エラーがでたのです。 > またなぜ書籍には\r\nが記載されていなかったのでしょうか? どの書籍をご覧になっているのかわからないため、正しい回答になるかどうかはわかりかねますが、その書籍がCGI作成を対象にしていない場合や、標準出力への出力用の関数としてputsを利用しているということが考えられます。 JM Project:http://www.linux.or.jp/JM/ manpage of PUTS:参考URL 上記のmanpageを読むとわかりますが、putsは引数に与えた文字列sと改行をstdoutに書き込むとなっています。当然ながら、printfではformat文字列の制御にしたがって出力をstdoutに書き込むため、format文字列や与える引数に改行がなければ、余分な改行がつくことはありません。だから\r\nを明示してあるわけです。それに対してputsは改行をつけてくれるため、改行文字を明示する必要がないのです。 このような理由から、putsとprintfの動作の違いが考えられるということです。 また、CGIを対象にしていない場合は、通常、標準出力はコンソールアプリケーションにおいて、コンソールに出力されるため、改行を考慮する必要がないのかもしれません。 もちろんこの両方の理由がともにあてはまるのかもしれません。 疑問の解消の一助になれば幸いです。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/puts.3.html
smalldeveloper
質問者

補足

つまり、Fire Foxのようなcgiではないプログラムとcgiプログラムでは書き方(ここでは改行コードのこと)が違うという解釈をしてよろしいのでしょうか? それとcgiじゃないプログラムとはどのようなものがあるんでしょうか?perlの場合は全部cgi見たいな感覚でかじっていたのでコンパイル言語とインタープリタ言語の違いが飲み込めずに苦労しています。 Internet Explorerの拡張子はexeになっていますが、これはcgiの書き方で書かれているんですか?

  • marimo_cx
  • ベストアンサー率25% (873/3452)
回答No.1

\rはキャリッジリターンのキャラクターコード(&h0D)を \nはラインフィールドのキャラクターコード(&h0A)を それぞれ表しています。 そしてWindowsで用いられている改行コードが\r\nです。 ちなみにUNIX系では\n、Macだと\rです。 前の質問?からするとcgiをやっているのですね? cgiは出力先は標準出力で良いんですけど、行単位でちゃんと出さなきゃならないし、mimeヘッダとデータ本体は改行文字2連で区切られなければならないので、改行文字がひとつも無ければ、ヘッダとデータの区切りがわからないので当然エラーをはきます。 ちなみにUNIX系でしたら改行は\nだけで十分です。(\r\nとする必要なし)

参考URL:
http://speana-1.hp.infoseek.co.jp/serial/serial_4/char.htm

関連するQ&A