• ベストアンサー

改行文字について

#include<iostream> using namespace std; int main(void) { char c; while (cin.get(c)) if (c == '\n') cout << "[RET]\n"; else cout << c; return(0); } これのif (c == '\n')の改行文字と等しいとは何のことを指すのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6635/9402)
回答No.2

>char型で(入力ストリームで)入力した文字を改行すると、 >自動的に改行文字とみなされるという事ですか? コンピュータは、文字「a」0x61も、改行文字 0x0a も、等しく扱います。 標準入力をキーボードから入力する際に、[A]キーを押すと、文字コード0x61(小文字a) が入力される。 Enterキーを押すと、0x0aという文字コードが入力される。 それだけの話です。 (unix系とWindows(DOS)系で改行の取り扱いが違うんですが…とりあえず話を簡単にするためにそうだと思っといてください。) 表示側では、ちょっと違います。 制御文字(0x01~0x1Fまでの文字コード)を表示する際に、ちょっと変わった動作をします。 通常の文字コードでは、0x61ならば「a」、0x62ならば「b」…というように、文字そのものが表示され、文字表示位置は一つ右に移動します。 でも、0x0aという文字コードを表示するときは、表示位置を一つ下げ(最終行ならばスクロールし)、表示位置を行の先頭とする、という動作になります。 それが改行です。 Backspace(0x08)を表示すると、現在表示位置を一つ左に戻します。 Tab(0x09)を表示すると、現在表示位置を、現在カーソル位置より右の8の倍数位置に移動します。 改行・バックスペース・タブは、次に文字を表示する位置が変わるだけで、文字そのものは何も出ません。 制御文字を「表示」するときに差異が出るだけで、1バイトずつ読む・1バイトずつ書く(表示する)というプログラム動作は通常文字だろうが制御文字だろうが変わらないというわけなんですが。 あと不思議に思うのはどんな点でしょう?

aiueo6391
質問者

お礼

なるほど、回答ありがとうございます。 よく解りました、 回答を元に、さらに勉強してみます。

その他の回答 (2)

  • Kaneyan-R
  • ベストアンサー率42% (1246/2903)
回答No.3

Enterキー自体が「改行文字を入力するキー」なのです。 蛇足かも知れませんが…… Windowsの場合、改行コードはCR+LFで、文字コードは0D0A(13+10)となります。UNIX/Linux系はLFで0A(10)、MacはCRで0D(13)となっているので、WindowsのコードはUNIX/Linux系、Mac共に改行として認識される様になっています。 しかし、CRとLFの片方しか認識されないので、認識されなかった方は無視されるか、半角スペースなどに置き換えられます。 プログラミングを行う場合、端末によってコードが異なるとそれを考慮したプログラムを書く必要があるので、OSが違っても同じプロセスでプログラムが書けるよう、エスケープシーケンスの¥nはそれらの違いを吸収して、一律に「改行コード」として処理するためのものです。

aiueo6391
質問者

お礼

すみません、ベストアンサーにしてからでした。 回答ありがとうございます。

  • asciiz
  • ベストアンサー率70% (6635/9402)
回答No.1

テキストファイル中で、改行文字のコードは、16進数でいう0x0aです。 文字コードで直接書くならば、"\x0a"となります。 ちなみにタブは0x09で、バックスペースは0x08です。 その様に、文字コードの数値を覚えているならば、 >if (c == '\n') は >if (c == '\x0a') や >if (c == 10) と書いても構いません。 でも普通の人はいちいち文字コードなんか覚えないので、わかりやすいように'\'+英字1文字、という表現ができるようにしました。 >特殊文字(エスケープシーケンス) >https://www.javadrive.jp/cstart/num/index5.html \n の n は Newline(改行)。実際の数値は0x0a。 \t の t は Tab。実際の数値は0x09。 \b の b は Backspace。実際の数値は0x08。 その様に、英語由来の頭文字が割り当てられています。 よく使う文字コードだけにエスケープシーケンス表現が割り当てられたものですので、0x00~0x1Fのすべての特殊文字にエスケープシーケンスは割り当たっていません。 逆に、アルファベットすべてが何らかの文字コードになる、ということもありません。(\qや\zといったエスケープシーケンスは存在しません) ---- テキストファイルと称されているものであっても、中身は16進数データの羅列なんです。 でも、「メモ帳」アプリでは、「改行文字」のあるところで改行表示するので、普通のテキストに見えるんです。 テキストファイルを16進数ダンプ表示すると、たとえば次のようになっています。 address data 文字表示 00000000 61 62 63 0A 64 65 66 67 0A 68 69 0A 6A 6B 6C 6D abc.defg.hi.jklm ※特殊文字は文字表現できませんので、右側の文字表示ではドットになっています これをメモ帳で読み込むと、 -------- abc defg hi jklm -------- このように、改行文字(0x0a=\n)の部分で改行して、表示されます。 そしてご質問に掲載のプログラムでは、改行文字の場合には"[RET]"+改行"を表示する、それ以外はそのまま出力する、となっているので、上記テキストをご質問プログラムに通すと、 -------- abc[RET] defg[RET] hi[RET] jklm[RET] -------- となるでしょう。

aiueo6391
質問者

お礼

回答ありがとうございます、 なるほど、文字コードは解りました、 しかしまだ何となくでしか解らないのですが疑問は、 char型で(入力ストリームで)入力した文字を改行すると、 自動的に改行文字とみなされるという事ですか? そこのしくみをできたら教えて頂けたら助かります。 よろしくお願いします。

関連するQ&A

  • ''C++の条件分岐分からないんですが

    #include<iostream> using namespace std; int main(){ int a; cout << "数値を入力してください\n"; cin >> a; if( a > 30) cout <<"31以上ですね\n"; } else if(a<10){ cout <<"10未満ですね\n"; } else { cout <<"30以下で10以上ですね\n"; } return 0; } これが例文なんですが、 変数aの値がbより小さい場合には、『aはbより小さいです』と表示させ、大きい場合には"a=a+b"を計算させる 文字変数mの中身が'a'ならば、『aが格納されています』と表示させて、'a'でないならば『'a'でない文字が格納されています』と表示させたあと、変数bとcを使った『b=b+c』を計算する。 変数aが、変数bより小さい場合には、『aはbより小さいです』と表示し、変数bより大きい場合には、『aはbより大きいです』と表示し、変数bと等しい場合には、『aとbは等しいです』と表示する #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else { __c = a + b; }return 0; } #include<iostream> using namespace std; int main(){ int a; if(m == 'a') __cout("aが格納されています\n"); } else { __cout("\'a\'でない文字が格納されています\n"); } return 0; } #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else if(a == b) { __cout("aとbは等しいです\n"); } else { __cout("aはbより大きいです\n"); } return 0; } これ合ってますか?あとプログラミング環境すらないので実行結果教えてもらっていいですか?

  • 入力に出現する数字文字をカウントするプログラム

    こんにちは、毎度お世話になります。 #include<iostream> using namespace std; int main(void){ char c; int cnt[10] = {0}; while(cin.get(c)){ if(c >= '0' && c <= '9') cnt[c - '0']++; } for (int = 0; i < 10; i++) cout << i << "の出現回数:" << cnt[i] << '\n'; return(0); } [/code] ここで質問なんですが、このプログラムの中で数字文字をカウントしているのはどこでしょうか? そして while(cin.get(c)){ if(c >= '0' && c <= '9') cnt[c - '0']++; } ここの部分が何を表しているのか解りません。 よろしくお願いします。

  • あるプログラミングでdoubleの箱が

    こんにちは、 とあるプログラミングでdoubleの箱が突然2つでてきて混乱しています。 //読み込んだ実数値は10で割りきれるか #include <cmath> #include <iostream> Using namespace std; Int main() { Double x; Cout <<"実数値: "; cin >> x; If (double m = fmod(x, 10)) { Cout<<"その値は10で割りきれません。\n"; Cout<<"剰余は"<< m << d"です。"\n"; } else{ Cout"その値は10で割りきれます" \n"; } } とあり、なぜ突然double mがでてきたのでしょうか? すみません m(__)m

  • 入力文字数がでません。

    C++です。以下を実行したのですが、実行結果に改行数は出るが文字数がでません。お願いします。 #include <iostream.h> int main(void) { char c; int ccount = 0; int ncount = 0; while (cin.get(c)) { ccount++; if (c == '\n') ncount++; } cout << "文字数=" << ccount << '\n'; cout << "改行数=" << ncount << '\n'; return (0); }

  • C++

    C++で書いた下記のプログラムが、文字の入力が1023個までなら実行されますが、1024個を超えると実行されません。なぜだか分かる方、教えてください。 #include <iostream> #include <string> using namespace std; int main(void) { string Str; cin >> Str; cout << "here"; }

  • getlineについて

    現在getlineを用いてプログラムを作成しようとしているのですが、例えば #include <iostream> using std::cin; using std::cout; using std::endl; int main(){ char buffer[81]; while(!cin.eof()){ cin.getline(buffer,sizeof(buffer)); cout << buffer << endl; while((!cin.eof())&&cin.fail()){ cin.clear(); cin.ignore(80,'\n'); } } return 0; } というプログラムを作った場合、標準入力から各行を80文字だけ読み込み出力をするわけなんですが、 この80文字という文字制限をなくしたい場合どういった工夫をすればいいのでしょうか?

  • C++で二分法のプログラム

    C++で二分法のプログラムを作るんですが x1-x2が十分小さくなれば(10^-5)終了する 例 cos(x/2)の解を出す これどうやればいいんですか?whileを使うらしいですが。 文法というのは、 if系、while、switch、continue、for、break文くらいしかやってないんですが #include <iostream> #include <cmath> using namespace std; int main() { までは行きますが… 出力はcout 入力はcinでお願いできないでしょうか

  • 二次方程式のプログラム

    C++で二次方程式の解を求めるんですが、虚数解の場合、a=0の場合、実数解の場合で求めるようにしているんですが、 #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c; cin >> a >> b >> c; if(a==0) { cout << (-c/b) << '\n'; } else if((b*b-4*a*c)<0) { cout << (-b/2/a) << 'i' << sqrt(4*a*c-b*b)/2/a << '\n'; } else { この先の最後の一文教えてください。抜けてて書いてないんです。

  • 配列の練習問題

    #include<iostream> using namespace std; //count関数の宣言 int count(char str[], char ch); int main() { char str[100]; char ch; cout << "文字列を入力して下さい。\n"; cin >> str; cout << "文字列から探す文字を入力して下さい。\n"; cin >> ch; int c = count(str, ch); cout << str << "の中に" << ch << "は" << c << "個あります。\n"; return 0; } //count関数の定義 int count(char str[], char ch) { int i = 0; int c = 0; while (str[i]) { if (str[i] == ch) c++; i++; } return c; } こんにちは。 この問題の解答のプログラムの意味がイマイチ解らないので良かったら教えて下さい。 確認がてらに質問します。 よろしくお願いします。

  • C++の二次方程式のプログラム

    #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c; cin >> a >> b >> c; if(a==0) { cout << (-c/b) << '\n'; } else if((b*b-4*a*c)<0) { cout << (-b/2/a) << 'i' << sqrt(4*a*c-b*b)/2/a << '\n'; } else { cout << (-b/2/a) << sqrt(4*a*c+b*b)/2/a << '\n'; } return 0; } 最後のelseの下のcoutが本当に分からないんで教えてくださいお願いします。一応この条件(a=0の時、aが0以上の時、aが0以下の時)で出題されてるんですが…

専門家に質問してみよう