こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

改行文字について

#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')の改行文字と等しいとは何のことを指すのでしょうか?
よろしくお願いします。

投稿日時 - 2020-03-09 13:55:20

QNo.9721483

困ってます

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

>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バイトずつ書く(表示する)というプログラム動作は通常文字だろうが制御文字だろうが変わらないというわけなんですが。

あと不思議に思うのはどんな点でしょう?

投稿日時 - 2020-03-09 18:42:04

お礼

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

投稿日時 - 2020-03-09 19:00:15

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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はそれらの違いを吸収して、一律に「改行コード」として処理するためのものです。

投稿日時 - 2020-03-09 18:55:22

お礼

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

投稿日時 - 2020-03-09 20:01:28

ANo.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]
--------

となるでしょう。

投稿日時 - 2020-03-09 15:02:09

お礼

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

投稿日時 - 2020-03-09 16:34:41