• ベストアンサー

C言語のエスケープ文字についての質問です

エスケープ文字の使い方がわからないので教えてください! \f と \v の使い方がわかりません。 printf()内に記述していろいろ試したのですがわかりません。 \v はprintf内に記述したら、X(バツ)マークが表示されるだけでした。 どなたか教えていただけませんか? できればサンプルを載せてくれればうれしいです。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★『\f』のサンプルを載せます。 サンプル: #include <stdio.h> // メイン関数 int main( void ) {  printf( "12345\b\b\b\ba\fb\n" );  return 0; } 解説: ・上記のサンプルをコンパイルして『command.com』というコマンド・プロンプトで実行します。  ここで注意しておきたいのが『cmd.exe』のコマンド・プロンプトではないことです。  コマンド・プロンプトには2種類あります。普段は『cmd.exe』を利用するのが一般ですが  もう一つ『command.com』というものがあります。こちらです。 ・『command.com』のコマンドラインから上記のサンプルを実行します。  すると次のように表示されます。  (1)12345  (2)1a345  (3)1a b5  (1)は最初の『12345』が表示されます。  (2)は『\b』×4個なので左方向に4つカーソル位置が移動します。そして『a』を表示します。  (3)は(2)の位置から『\f』により1つ右方向に移動します。そして『b』を表示します。 ・(3)の『\f』は右方向に1つ移動する動作ですが同時に文字が消えてしまうようです。  昔のMS-DOS時代のパソコン環境では『\f』の動作は右方向に1つカーソルが移動するだけです。  文字『3』などは消去されません。ここがちょっと動作が違うようです。  でもこれは今のパソコン環境ではまともの『エスケープシーケンス』が動作しないからです。 まとめ: ・昔を思い出して C 言語のエスケープシーケンスをまとめると下のようになります。  [C言語][名前][CTRL][動作]  『\a』『BEL』『^G』…ビープ音  『\b』『BS』『^H』…左方向へ1桁カーソルを移動  『\f』『FF』『^L』…右方向へ1桁カーソルを移動  『\n』『LF』『^J』…下方向へ1行カーソルを移動  『\r』『CR』『^M』…復帰(同じ行の一番左側に移動)  『\t』『HT』『^I』…タブ移動(8桁文字分)  『\v』『VT』『^K』…上方向へ1行カーソルを移動 ・上記の動作は昔の MS-DOS パソコンの時に利用できた『エスケープシーケンス』の動作です。  今の多くのパソコンでは一部の動作が目で見て確認できません。 ・以上。

Guchiken
質問者

お礼

回答ありがとうございますっ!!! サンプルを載せてくれてありがとうございます! 解説も付いててすごく分かりやすかったです!! MS-DOS時代と現在の環境では動作が違うんですね! 勉強になりました! また、私が質問していたら教えてやってください。 回答ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

エスケープシーケンスの標準はVT100ですので、 http://ja.wikipedia.org/wiki/VT100 VT100のエスケープシーケンス。 http://hp.vector.co.jp/authors/VA016670/escape_code.html C言語もVT100端末を操ることが基本機能になっています。 ただし、Windowsのコンソールは、VT100をシミュレーションしていませんので完全な再現性は無いと思います。ようするに、\fや\vはちゃんと動作しません。

Guchiken
質問者

お礼

回答ありがとうございます! \f や \v だけがどうしても使用方法がわからなかったので、 zwi さんのような専門家がいると、未熟者の私としては心強いです。 この2つのエスケープ文字については無視して勉強していこうと思います。 回答ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • master000
  • ベストアンサー率33% (16/48)
回答No.3

下のURLはいかがでしょうか。

参考URL:
http://winofsql.jp/VA003334/cmaterial040425213445.htm
Guchiken
質問者

お礼

回答ありがとうございます!!参考にさせてもらいます。

全文を見る
すると、全ての回答が全文表示されます。
  • master000
  • ベストアンサー率33% (16/48)
回答No.2

聞く前にGoogleで検索してみましょう。 「エスケープ文字 C言語」で一番先に出てきますよ。 表題が「基礎的C言語文法のまとめ」のページで見てください。

Guchiken
質問者

お礼

回答ありがとうございます! 聞く前にこのサイトを見たんですが、 意味(改行、垂直タブなど)しか載ってなくて、 具体的な使い方というか効果が実感できるようなコードが載ってないので ここに質問したんですけど…

全文を見る
すると、全ての回答が全文表示されます。
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

C言語の規格上の正確な定義は未確認ですが,普通は次の制御文字に対応します. ・\f:FF (Form Feed,改ページ,ASCII では 0x0C) ・\v:VT (Vertical Tab,垂直タブ,ASCII では 0x0B) これらを出力した場合にどういう動作をするかは出力装置依存です. 昔はプリンタに FF を出力して改ページさせたり,そのためにテキストファイル内の 改ページさせたい位置に FF を埋め込んだりしたこともありましたが, 最近ではプリンタに直接制御文字を出力することは (ドライバ以外では) ありません. テキスト画面への出力ならば,理論上は画面消去ということになるはずですが, 実際には FF は無視して ANSI エスケープ・シーケンス (ESC '[' '2' 'J') などで 画面消去するというものが圧倒的に多かったです. VT にいたっては,「垂直方向の特定の位置に移動させる」という程度の意味しか 規定されていないし,実際の使用例もほとんど記憶にありません. (逆改行や半改行として使ってた例もあったような気がするが….) そういうわけで,最近では特殊な出力装置を制御する場合以外,\f や \v を 使う機会はほとんどないと思います. 制御文字 (Wikipedia) http://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97 Control character (Wikipedia 英語版) http://en.wikipedia.org/wiki/Control_character ASCII (Wikipedia) http://ja.wikipedia.org/wiki/ASCII

Guchiken
質問者

お礼

丁寧な回答ありがとうございます! ほかのエスケープ文字の使い方はわかっていたので、 その2つについて、使い方を知りたかったんですが、 使う機会がほとんど無いなら、あきらめようと思います。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 エスケープ文字 エスケープシーケンス?

    プログラミング初心者です。 早速ですが現在、C言語入門書に目を通している最中なのですが理解出来ない部分が有ります。 内容としましては 「エスケープ文字」 に関してです。本書ではあまり理解出来なかったのでネットで検索していると、「エスケープシーケンス」 と言う用語も数多く出てきました。 いろいろ検索し私なりに出した答えは..... •エスケープ文字 = 文字が持つ特別な意味を無効にする為の文字。 •エスケープシーケンス = 改行などの特殊な文字を英数字の組み合わせで表現した物。 と....上記の様に私は理解しているのですが現在読んでいるC言語入門書の内容だとエスケープ シーケンスと考えられる説明が 「エスケープ文字」 として記述されています。 それはC言語ならではの扱い方なのか?、本書の内容が間違っているのか? 分かりづらい説明だと思うのですがよろしくお願いいたします。 因に現在読んでいる入門書は 「読本C-C言語徹底攻略」 と言う本でかなり昔のになります。 

  • Jedit X でエスケープ文字の置換に関して

    Jedit X 2.03 を利用しています。Mac の環境は Mac OS X 10.5.4 になります。 Jedit X にて、エスケープ文字を置換したいと思っています。 具体的には、垂直タブ(\v)を改行(\n)に変換したいと思います。 少し調べた所、Jedit X では、エスケープ文字の場合、¥(円マーク)では無く\(バックスラッシュ)との事でしたが、Jedit X で、半角英数で\vと入力しても、認識しませんでした。 最終的には、不可視の垂直タブ及び、改行(パラグラフブレーク)を表示させ、垂直タブ及び、改行(パラグラフブレーク)の記号をコピーする事が出来ましたので、置換をする事は出来ましたが、純粋にエスケープ文字を認識させて、置換させる事は出来ないでしょうか。 エスケープ文字の置換は頻繁に行いませんが、Mac で他に良いエディターが有れば合わせてアドバイスを頂ければ嬉しく思います。 ## safari の画面上では、バックスラッシュを入力すると\になる為、上記質問では全角のバックスラッシュ(\)を記載しています。

    • ベストアンサー
    • Mac
  • LIKE文でエスケープ文字自体をエスケープする方法

    SQLのLIKE文では A LIKE '\%文章' ESCAPE '\' のように、ワイルドカード用の文字列をエスケープする方が用意されています。このとき、条件文にエスケープ文字自体を含める(上のSQL文であれば、「\」をエスケープ文字と定義していながらも、「\%」を「\」「%」と独立した文字として検索にかける)場合はどのように記述したらよいでしょうか。

    • ベストアンサー
    • MySQL
  • すみません…。C言語の質問です!!

    以下のような、ニューロン法のプログラムを作成したのですが、上手く結果を得ることが出来ませんでした…。どこが、どのように間違っているのかが分からないので、プログラムを修正していただけると嬉しいです。 よろしくお願いします。 1. #include <stdio.h> 2. #include <stdlib.h> 3. #include <math.h> 4. /*--- 関数 f( x ) = x - cos( x ) ---*/ 5. double f( double x ) 6. { 7. return x - cos(x) ; 8. } 9. double df( double x ) 10. { 11. return 1 + sin(x) ; 12. } 13. /*--- メイン関数 ---*/ 14. int main( void) 15. { 16. int cnt ; 17. double x_OLD, x_NEW, eps = 0.0001 ; 18. cnt = 0 ; 19. x_NEW = 1.5 ; 20. printf("計算回数 x f(x)\n") ; 21. printf("%d %lf %lf\n", cnt, x_NEW, f(x_NEW)) ; 22. do{ 23. cnt++; 24. x_NEW = x_OLD ; 25. x_NEW = x_OLD - ( f(x_OLD) / df(x_OLD) ) ; 26. printf("%d %lf %lf\n", cnt, x_NEW, f(x_NEW)) ; 27. }while( fabs(x_NEW - x_OLD) < eps ); 28. }

  • C言語の質問です

    ニュートン法のプログラムを組んだのですがPAD図が描けなくて困ってます どなたか回答お願いします /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double a;    //グローバル変数 double f(double x)  //fは関数f(x) { return x * x - a; //f(x)=x~2-a } double df(double x)  //dfはf(x)の導関数f’(x) { return 2 * x; //df(x)/dx = 2x } double newton(double x, double (*f)(double), double (*df)(double), double eps) { int n = 0;     //初期化 double x0, err;    //x0は初期値 printf("# n, x, err\n"); printf("%4d, % .15e\n", n, x); do { n++; x0 = x; x = x0 - f(x0) / df(x0); //切片でy=0、x=x1 err = fabs(x-x0); printf("%4d, % .8e, % .15e\n", n, x, err); } while (err >= eps); return x; } /*メインルーチン*/ int main(void) { double x, eps = 1.0e-10; //収束条件 char s[128]; fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); while (a <= 0.0) { fprintf(stderr, "'a' には正の数を入れてください。\n"); fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); } x = (a + 1.0) / 2.0; x = newton(x, f, df, eps);   //ニュートン法の実装 printf("\n# √(%e) = % .15e\n", a, x); return 0; }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語のプログラムでうまく動きません。

    xとyを入力してその商を求めよという問題なのですが、大きい数字を小さい数字で割るようになっています。また、当然分母が0の時には不定となるので、次のようなプログラムを作りましたが、うまく動きません。どこが悪いか考えてもわかりませんでした。教えていただけませんでしょうか。 #include<stdio.h> main() { int x; int y; double syou; printf("xを入力せよ"); scanf("%d",&x); printf("yを入力せよ"); scanf("%d",&y); syou=x/y; if("syou>=1") { if("y==0") { printf("不定です"); } printf("答えは%fです。",&syou); } else { if("x==0") { printf("不定です"); } syou=y/x; printf("答えは%fです。",&syou); } } これでx、yを入力しても不定と出てきて、xの方が大きいときには見当はずれの大きな数字が出てきます。逆にyの方が大きいと同じく不定と出てきて答えは0.000と表示します。

  • C言語で 小文字を大文字に変えるプログラム

    C言語で小文字を大文字に変えるプログラムを造ったのですが、エラーが出てしまいます。 どこが間違っているのか教えてください。 #include<stdio.h> main() { char a[100]; scanf(%c,&a[i]); int i=0; while(i<100){ i++; if(a[i]>60){ printf("%x-20",a[i]); }else{ printf("%x",a[i]) } } }

  • PHPのヒアドキュメントでは、\はエスケープされない?

    PHPのメール関数のメッセージ組み立て部分で使用しているヒアドキュメント内で¥マークを出力したい場合、「\」と記述するとエラーになってしまいます(「\\」と記述すると、ちゃんと「\」と表示されます。)。 PHPのヒアドキュメントでは、\はエスケープされないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

このQ&Aのポイント
  • scanncutdx SDX1010EPを使用して2mm厚の画用紙をカットしたいが、付属の刃ではカットできず、厚物用の刃が必要かどうか疑問に思っています。
  • お使いの環境はMac OSで無線LANに接続しています。
  • ブラザー製品についての質問です。
回答を見る