lC言語 入出力フォーマット・コード (1/2) '97. 1.17  
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
.C言語_ 3 フォ-マットコ-ド 6 演算子 9 FOR  集合デ-タ  目的別
1 表示してみる 4 変数と定数 7 条件判断 10 WHIILE  ポインタ     
2 エスケ-プ コ-ド 5 デ-タ入力 8 分岐   未使用  関数   ★ 
P1 フォーマット・コード  表示桁数  説明(使用例) 
P2 関数 printf()の詳細 ( 引数の受け渡し  任意個引数関数 )
 

入出力フォーマット・コード 説明は後部にあります。
  コード 型(例)       意味
  %o   int           8進数表示
  %u   unsigned int 10進数表示
  %d,%i int            〃     (符号付 ...負の値も表現できます。)
  %x,%X  int          16進数表示
   %p   int            〃      (アドレス表示用 ..0を含む4桁表示)
  %e,%E double       10進数 浮動小数点表示 (指数表示)
  %f   double         〃   〃  (小数表示)
  %g,%G double         〃   〃  (短縮表示)
  %c   char         1文字
  %s   char *       \0 まで、または指定された字数までの、文字列
型 は、正しく表示できるデータの型の例です。
整数値は %o(8進数) %d(10進数) %u(10進正数) %x(16進数) で表示します。
char, short int, long int, unsigned int 等のデータを表示します。
 %x は、9 を越える数を a〜f のように小文字で表示します。
 %X は、A〜F のように大文字で表示します。
long 型のデータは、%lo %ld %lx %lu のように、l(小文字のエル)を付けて書きます。

小数値は %e(=%E) %f %g(=%G) で表示します。
float, double, long double のデータを表示します。
 %e は、必ず指数表現されます。
 %f は、必ず小数点表現されます。小数点以下6桁まで表示します。
 %g は、全桁数6桁(小数点も数える) まで表示します。前後の 0は表示されません。
( 表示桁数は指定可能です。三つの中で %g がもっとも短い表示になります。)
long double型には、%Le %LE %Lf %Lg %LG のように、L を付けて書きます。

一個の文字は %c で表示します。
  などの2バイト文字は、1バイトずつに 分けて表示する必要があります。
文字列(文章) は %s で表示します。これだけは、表示対象をポインタで指定します。
 文字列は、文字というデータを複数並べたものです。
 %s で表示するデ-タには、ポインタ(文字列の先頭位置=文字配列名) を指定します。
 printf() の呼出しの中に文字列を書いた場合は、勝手にポインタが作られます。

 %% と、% を二個書いた場合は、フォーマットコードではなく、文字の % として扱われます。
octa? : (8?)
unsigned : 符号なし(正の)
decimal : 十進法の (decimalism : 十進法)
hexad? : (6個?)
short : 短い
long : 長い
Large? : (大きな?)
pointer : ポインタ
exponental : 指数の (exponent : 指数)
floating [a decimal point] : 浮動[小数点]
g :
charcter : 文字
string : 文字列
 浮動小数点表示 : 小数値を普通に表示します。
 小数点の位置を変更できない 固定小数点表示(古い方式) と区別する呼び方。

例  printf("%d %o %g ",-7,9,1.3); -7 11 1.3 と表示されます。
例  printf("解答 X = %d ",5); 解答 X = 5 と表示されます。


データの 表示桁数の指定
  %m.n型   m  表示場所の大きさを字数で指定します。 .....省略可。
         .n  実際の表示字数を指定します。 .....省略可。
           o d x e f g c s などの、表示方法を書きます。
一個の文字が表示される分の場所(スペース) は、桁と呼ばれます。
m で、表示する場所を確保します。(全角文字は2桁として数えます。)
n で、実際に表示する桁数を指定します。
n に、m よりも大きい値を指定すると、n の方が優先されます。( m=n になります。)
表示場所よりも表示内容が小さい場合は、余った表示場所にはスペースが表示されます。

この指定をしなければ、文字は左側から順番に表示されます。
この指定をすると、m の範囲内で右詰に表示されるので、右端を揃えた表示ができます。
%-m.n のように - を付けると左詰表示になります。
( 次に表示する内容の表示位置を揃えることができます。)

数値の場合
m で、表示する場所を確保します。(小数点も含め、全体の表示桁数を指定します。)
n では、小数点以下の表示桁数を指定します。
整数部分が m.n より大きい場合は、m は無視されます。( m=整数部桁数+n)
表示場所よりも表示内容が小さい場合は、余った表示場所にはスペースが表示されます。
※ %0m.n のように 0 を付けて書くと、スペースではなく 0 が表示されます。

例  printf("%7s","EFG"); SSSSEFG と表示されます。(全7桁)
例  printf("%.3s","ABCDE"); ABC と表示されます。(有効3桁)
例  printf("%7.3s","ABCDE"); SSSSABC と表示されます。(全7桁・有効3桁)
例  printf("%-7s","ABC"); ABCSSSS と表示されます。(全7桁・左詰)
例  printf("%7.3f ",10./3); 003.333 と表示されます。(全7桁・小数点以下3桁)
例  printf("%07.3f",10./3); 003.333 と表示されます。(スペースの代わりに0)
S0は、 その分スペースが表示されるという意味です。


参考 : 表示桁の別指定
  %.*型  表示桁数を別に指定します。

この場合は、ひとつのフォーマットコードに2つのデータが対応します。
ひとつは表示桁数のデータで、もうひとつは表示するデータそのものです。
表示桁数の指定には、変数を使用することも可能です。
※ 入力の場合 : * を付けた場合は入力しません。
例  printf("%.*",7,"ABC"); SSSSABC と表示されます。(全7桁)

参考 : その他の指定
上記以外にも、次のようなたくさんの指定項目があります。
% に続くこれら以外の文字はそのまま表示されます。

 出力(表示)の場合。
% - *    5.3h  d
  +          l   
 スペース    L など 
  #          F 
             N
 例 %#5.3lf
   入力の場合。
%  *  5  h d
         l
         L など
         F
         N
 例 %*lf
%Fp は far ポインタ
%Np は near ポインタ
一番右側の項目が、このページの最初に書かれている項目です。
詳細は省略しますが、おおよそ次のとおりです。
- : 左揃えで表示します。
+ : 数値の+−を表示します。
スペース : 数値が+のときには、+の代わりにスペースを表示します。
# : 型の特徴を表わすような表示になります。
 8進数表示(%o) のとき 012 のように、0 を付けて表示されます。
 16進数表示(%x) のとき 0xA1 のように、0x を付けて表示されます。
 小数表示(%f など) のとき 必ず小数点が表示されます。


説明
関数 printf() は、一番目の引数の内容(文字列) を表示します。
文字列の中に %s などのフォーマットコードがあると、二番め以降の引数の内容と置き換えて表示します。

関数 printf() は、一番め引数の "" の中を表示します。
例   printf("ABC=");  ABC= と表示されます。

"" の中にフォーマットコードが含まれているときは、
その位置に、二番め以降の引数の内容を代入して表示します。
( )の中に複数の引数を書くときは , で区切って書きます。
例   printf("ABC=%d", 5);   ABC=5 と表示されます。

"" の中に複数のフォーマットコードが含まれているときは、
二番め以降の引数の内容を順番に代入して表示します。
例   printf("%d %d %d", 1, 2, 3 );   1 2 3 と表示されます。

フォーマットコード %s は、文字列を表示します。
表示データには、文字列か、別に用意した文字配列の 配列名を指定します。
例   char st[4]="ABC";
 printf("%s", st ); 
 文字配列 st を用意します。
 ABC と表示されます。
   printf("%s","ABC" );   ABC と表示されます。
配列名 st は、配列の先頭位置(ポインタ) の別名になっています。
下の例は、関数の呼出しの中に配列(配列名は無し) を作っています。
この場合は場所がすぐ判りますから、コンパイラが自動的にポインタを作ります。

メモ : printf() の本体は stdio.h の中にあります。
上例はいずれも、stdio.h の中の、printf() 本体を呼出す命令です。
() の中の引数データを printf() 本体に送って、表示させます。
文字配列は そのポインタが渡されます。
関数本体はポインタを使って 文字配列のデータを見つけて表示します。


入出力フォーマット・コード
コンピュータのデータそのものには、文字や数値の区別がありません。
たとえば、文字の A と数値の 65 は同じ 41(16進表示の場合)として記録されています。(詳細はパソコンの話しのページ参照。)

フォーマットコードは、データを入出力(記録/読み出し)する場合に、どんな種類()として扱うのかを指定する記号です。

入力時 → 指定された型のデータを2進数に変換して入力します。
出力時 → データを、指定された型に戻して出力(表示)します。

従って、10進数として入力したデータは、10進数の指定をして表示するようにします。
特別な場合を除き、データの入出力(記録/読み出し)時に、同じ型指定を行います。
入出力時に同じ型を指定すれば、実際のデータが2進数であることを意識する必要はありません。

用例
#include <stdio.h>
void main()
{
  int X=12;
  int Y=34;
  printf("%x",17);     /* 17を、16進数で 11 と表示します。*/
  printf("%d %d",X,Y); /* X と Y の間を1文字あけて、10進数で表示します。*/
  printf("%f",10./3);  /* 10÷3 を、3.333333 と浮動小数点表示します。*/
  printf("%d",5*6);    /* 5×6 を、10進数で 30 と表示します。*/
  printf("%ld",4*3L);  /* 4×3 を、10進数で 12 と表示します。*/
}

なお、10. とあるのは、10/3を浮動小数点のデータにするためです。
同じく、3L とあるのは、4*3を long型のデータにするためです。
L や . は、両方の数に付けても、どちらか一方でもかまいません。

%ld のデータに 4*3 と書くと、12 ではなく 13172748 のように表示されます。
特に指定しなければ、数値は 2Bytの int型のデータとして扱われるからです。
データはメモリに 1Byt単位で逆順に記録されます。
(読み出すときも逆だから普通はOK。)
ところがこれを、%ld(4Byt の long型)として表示しようとすると、次の 2Bytのデータもいっしょに読み出します。
しかも逆順で読み出して表示するので、変な数が表示されるわけです。
( 0c が、0c00 と記録される。 →  0c00xxxx が、xxxx000cと読み出されます。)
10進数の 12は、16進数では 0cです。


フォーマット指定出力のプログラム例
数値データを、フォーマットコードを指定して表示します。
#include<stdio.h>		/* stdio.h の内容を、ここに挿入します。 */
void main()			/* 以下、処理の内容を書きます。 */
{
  int X0=16;			/* 変数を宣言し、内容を初期化します。 */
  int X1=17;
  int X2=18;

  printf( "10進数で表示します。\n" );              /* メッセージを表示します。*/
  printf( "X0=%d X1=%d X2=%d\n\n" ,X0,X1,X2);     /* 説明と、変数の内容を表示します。*/
  printf( "16進数で表示します。\n" );
  printf( "X0=%x X1=%x X2=%x\n\n" ,X0,X1,X2);
  printf( "計算式も使えます。10×3=%d\n\n" ,10*3); /* 表示データには計算式なども使えます。*/
}

 "" の中の X0= や X1= の部分は、文字としてそのまま表示されます。
 "" の中の %d の部分は、その位置に "" の右側の X0,X1,X2 を 10進数で表示します。
 "" の中の %x の部分は、その位置に "" の右側の X0,X1,X2 を 16進数で表示します。
\n は改行コードで、2つ有れば2回改行します。
文字データを、フォーマットコードを指定して表示します。
#include<stdio.h>         /* stdio.h をインクルードします。 */
void main( )                    /* 以下、処理の内容。*/
{
  char S[4]= "ABC" ;                 /* 変数を宣言し、内容を初期化します。 */

  printf( "文字として表示します。\n" ); /* メッセージを表示します。*/
  printf( "S=%s\n\n" ,S);              /* 説明 S= と、変数 S の内容を表示します。*/
  printf( "16進数で表示します。\n" );
  printf( "S=%x %x %x %x\n\n" ,S[0],S[1],S[2],S[3]); /* 文字を1個ずつ 16進表示します。*/
}
16進数での表示は、文字のアスキーコード表示します。
16進数による表示なら、文字としては表示できないようなデータでも表示することができます。

char S[4] は、A,B,C などの半角文字4個を代入できる S という名前の配列です。
配列は、同じ種類のデータに 番号を付けて順番に並べたものをいいます。
S[0], S[1], S[2] はそれぞれ、1番目の文字, 2番目の文字, 3番目の文字 です。
最後の S[3] には、文字列の終りを表わす記号 \0 が入ります。

配列への代入は、配列の大きさを越えて行うことができます。
そのようなプログラムを作っても、正常にコンパイルされます。
しかし、無関係な位置のデータに代入するわけですから、実際に動作させると 普通は誤動作します。
必要な大きさよりも大きな配列を宣言しても、\0 までのデータしか使われませんから、動作上の問題はありません。

配列変数については [集合データ] [ポインタ] のページにも記事があります。


C言語 2 エスケ-プ コ-ド 3 フォ-マット コ-ド 4 変数と定数
 
  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html