質問: 空白文字 \f と\v の違いについて たとえば、”垂直タブ” \vで printf("aaa\vbbb\n")とすると aaa ***bbb (*は空白とします) ”書式送り” \fで printf("aaa\fbbb\n")とすると aaa ***bbb (*は空白とします)と同じ結果になります。 何か、c言語で”垂直タブ”と”書式送り”で違う使い方があるのでしょうか。 宜しくお願いします。 なお、環境としてはredhat linux でviを使っています。
回答: 「c言語で」ではなくてシステムあるいは出力装置によって違いがあります。 例えば"\f"で示されるform feed制御文字はプリンタなどでページ送りの意味に扱われます。(これもプリンタの機種やプリンタに送られる文脈で解釈が変わることがあるので「必ずそうなる」というものでもないです。) 一方で"\v"で示されるvertical tab制御文字は今でも使われるhorizontal tab("\t")の垂直方向版であらかじめ規定されたタブ位置まで印字位置を進めます。 ただ、いずれも今の時代では制御文字として本来の意味を発揮する使い方はほとんどないだろうと思います。linux、というよりはターミナルエミュレータ(xtermとか)の仕様によりますけれど、画面上ではあまり意味がないので同じ桁位置で次行移動くらいの実装になっているのでしょう。記憶に定かでないのですが一世を風靡したターミナルvt100がそんな仕様だったのかも知れません。なお、ff("\f")はページ送りの意味から転じて画面クリアの動きをするターミナルもあるようです。 違いがありますか、ということについては、\vと\fでは出力される文字コードが違うので出力をファイルに書く(リダイレクトなども含む)なら違いがあります。その制御文字コードをあるデバイス(ターミナルとかプリンタとか)に送ったときに違いが出るかというのはデバイスに依存します。質問のケースだとたまたまそのターミナルでは"\v"でも"\f"でも同じ動きをするので違いがない、ということです。別のデバイスに送れば違いが出る可能性はあります。 余談ですが、linuxで改行として扱われているline feed("\n")やmacで改行として扱われるcarridge return("\r")も似たような状況、つまりシステムや出力装置によって解釈が異なる状況があります。 もともとはcrは「同じ行の先頭に印字位置(carridge)を戻す(return)」という意味で、lfは「(桁位置に関係なく)次の行(line)に送る(feed)」という意味がありました。これを比較的正確に残しているのはms windowsの文字コードの扱い方です。といって、テキストデータを扱うにも、そのプログラムを作るにも改行コードがcrとlfの2バイトになるのは面倒なのでunixのようにlfだけを使う(lfにcrの動きを含む)ようになったりmacのようにcrだけになったりして今に至っています。