• ベストアンサー

空白文字 \f と\v の違いについて

たとえば、”垂直タブ” \vで printf("aaa\vbbb\n")とすると aaa ***bbb (*は空白とします) ”書式送り” \fで printf("aaa\fbbb\n")とすると aaa ***bbb (*は空白とします)と同じ結果になります。 何か、c言語で”垂直タブ”と”書式送り”で違う使い方があるのでしょうか。 宜しくお願いします。 なお、環境としてはRedHat Linux でviを使っています。

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

  • ベストアンサー
  • dummyplug
  • ベストアンサー率58% (134/230)
回答No.1

「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だけになったりして今に至っています。

PHYOPHYO
質問者

お礼

大変詳しいご説明、納得しました。 有難うございました。

関連するQ&A

  • 指定文字列を空文字に

    教えてください。 文字列(数字)に含まれる「,」を空白文字に変換しようと思い、下記のように記述しましたがうまくいきません。 $aaa='11,,111'; $bbb = str_replace($aaa,'',','); $bbbには「,」が返ってきてしまいます。$aaaは「11,,111」のままです。 $bbbに「11111」という値が返ってきてほしいのですが、どうすればよいでしょうか? どうかご教授ください。

    • ベストアンサー
    • PHP
  • C言語の初歩的な質問ですが・・・

    コマンドプロンプトでの実行結果が aaabbbccc AAA BBB CCC と出力されるプログラムを作りなさいという問題で、 #include <stdio.h> int main(void) { printf("aaa"); printf("bbb") printf("ccc\n"); printf("AAA\nBBB\nCCC\n"); return 0; } という回答例があり、この回答例以外の回答を全く同じ条件で考えないといけないのですが、かなり考えてもできませんでした。条件は、aaabbbcccは3つのprintf()で出力で、AAAとBBBとCCCは1つのprintf()で出力です。 ヒントに\nの使い方 とあるのですが、、よろしければ回答お願いします。

  • sizeof が分かりません!

    Cの予約語で"sizeof"がありますが、 普段おきまりで良く使っているのですが、 いまいち理解出来ないので誰か教えて下さい。 例えば、以下の場合sizeofの結果はどうなりますか? char s_aaa[]="ABCDE"; char s_bbb[4]; memset(s_bbb, '\0', sizeof(s_bbb)); memcpy(s_bbb, s_aaa, sizeof(s_bbb)); printf("s_aaa → :[%d],[%d]\n", strlen(s_aaa), sizeof(s_aaa)); printf("s_aaa → :[%d],[%d]\n", strlen(s_bbb), sizeof(s_bbb));

  • C++でofstreamに空白を含む文字列を<<するとそれ以降の文字が書き込まれない

    以下のようなテストプログラムを書いたのですが、 期待した動作になりません。 #include <fstream> int main() { std::ofstream ofs("C:/test.txt"); char moji[] = "aaa bbb"; ofs << moji << std::flush; ofs.close(); } テキストファイルにはaaaしか書き込まれず、bbbが無視されています。 ifstreamが空白文字までで処理をとめるのは知っていましたが、 ofstreamが書き込む際も同じなのでしょうか。 空白を含む文字列を書き込むにはどうすればよいでしょうか? よろしくお願いいたします。

  • ポインタ配列について

    struct AAA{ char *aaa; char *bbb; }; main(){ struct AAA *BBB[36]; ... rtn = sub(BBB); ... rtn = subsub(BBB); } void sub(*BBB[36]){ ... for(i=0; i<3; i++){ BBB[i] = (struct AAA*)malloc(sizeof(struct AAA)); } ... } void subsub(*BBB[36]){ ... for(i=0; i<3; i++){ printf("[%s]\n", BBB[i]->aaa); } ... } このような流れのプログラムを組みたいです。 *BBB[36]に値を設定してその値を使うプログラムです。 "struct AAA"の内容を大量に受信するので*BBB[36]としました。 sub()、subsub()の引数の書き方*BBB[36]はあってますか? またsub()、subsub()関数の引数*BBB[36]は他にもっとシンプルなやり方があると思うのですが。 どなたか教えて下さい。 宜しくお願いします。

  • 抽出して並べ替えたい

    初めまして 非常に悩んでいます。 エクセルシートの列に下記のようにデータが並んでいます。(文字列) AAA bbb ccc (空白) BBB ddd eee (空白) AAA bbb ccc (空白) AAA eee ggg 並べ替え後 AAA AAA BBB bbb eee ddd ccc ggg eee 尚、列上でセル位置は任意で、空白行も任意です。(1つ以上です) できれば関数でお願いします。 VBAの場合、使用したことがないので詳しくお願いします。

  • 特定ディレクトリ以下を内部のWebサーバBにプロキシする設定

    内部のWebサーバAにプロキシする設定が分からないので、どなたかお願いします。過去に設定した経験があるのですが、どうしても思い出せません。 http://10.1.1.1/aaa にアクセスすると、内部のWebサーバBの /bbb の配下が表示される という動きです。 httpd.conf としては、 XXXXXXXX /aaa http://192.168.1.5/bbb という書式だったと思います。 ■トポロジー■ client | 10.1.1.1 (Web-A_external) 192.168.1.1(Web-A_internal) | 192.168.1.5 (Web-B) Apache/1.3.19 (Unix) Redhat Linux 9 XXXXXXXX の部分を教えてくださいませんか 以上よろしくお願いいたします。

  • 全てのプロパティが空白のオブジェクトは・・。

    例えば、 「aaa」、「bbb」、「ccc」とプロパティを持つオブジェクト「$obj_test」で、 $obj_test->aaa = "" ; $obj_test->bbb = "" ; $obj_test->ccc = "" ; とした場合、「empty($obj_test)」では真とはなりません。 全てのプロパティが空白のオブジェクトを、emptyと瞬時に判断する関数または方法はあるでしょうか?

    • ベストアンサー
    • PHP
  • 構造体の型について

    ある構造体をxxxと名づける以下のプログラムを作成しました。 ーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx aaa; strcpy(aaa.variable,"bbb"); printf("%s\n",aaa.variable); } ーーーーーーーーーーー これは動き、bbbと表示されます。 しかしながら、構造体のポインタを使用した 以下のプログラムではコンパイルはとおりますが実行時にコアダンプして落ち ます。 ーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx* aaa; strcpy(aaa->variable,"bbb"); printf("%s\n",aaa->variable); } ーーーーーーーーーーーーーーーーーーーーーーー 両プログラムの意図はまったく同じなのに何故いけないのでしょうか。

  • sedで「(~)」を使って文字列の一部を取り出し

    sedで「(~)」を使って、文字列の一部を取り出したいのですが期待した結果になりません。 以下のようなファイルがあります。 そこから、最初に見つかった「A-Z0-9」を含む文字列を取り出したいのですが、 どうしても、2番目にでてくる「0-9」でなる文字列が取り出されます。 環境は、Solaris/Linuxになります。 ■ファイル cat aaa "aaa","bbb","ccc","123456","ddd","eee","fff,"0000","ggg" "aaa","bbb","ccc","AAA123","ddd","eee","fff,"0000","ggg" ■sed sed 's/.*,"\([A-Z0-9].*[0-9]\)",.*$/\1/g' aaa ■結果 0000 0000 期待する結果は、 123456 AAA123 なのですが、 期待した結果を取り出すにはどうしたらよいのでしょうか。

専門家に質問してみよう