C言語において文字列は、charの配列の初期化に利用できます。
それは、文字列が単に文字コードが並ぶ記憶域として記憶されるからです。
文字列の表記自体が先頭文字コードのアドレスを表現しているので、
char * 型になり、この型の変数で、管理できます。
そして、文字列の文字並び終端が'\0'という約束のもとでprintf関数など作られています。
(先頭文字の位置さえ分かれば、その位置から辿って全体を表示できます)
printfの第一引数が このchar * 型を受け取る仕様です。
そして、この文字の並びに%が含まれると、
第二引数以降の情報をその%直後の文字に従った文字並びに変換して、
標準出力へ出力するよう作られています。よって次のようなこともできます。
プログラム | 実行結果 |
---|---|
#include <stdio.h> main() { char a[10] = "\ndata=%d\n"; char * s; s = a; /* aの位置にある文字列を管理 */ printf( s , 15); /* 15を10進数の文字並びで出力 */ a[7] = 'X'; /* % 直後のdをXに変更 */ printf( s , 15); /* 15を16進数文字並びで出力 */ } |
data=15 data=F |
しかしこの仕組みがあるため、第一引数で%を含む文字列を単純にその通り出力することができません。
(%一つを出力する場合は%%と2つ並べる必要がありました)
それで、指定した位置から並ぶ文字コードを、
'\0'が出現する直前まで表示する%sの指定があります。
これなら、文字列を単純に表示するだけなので、一つの%で一つの%を出力できます。
以下に簡単な例を示します。
プログラム | 実行結果 |
---|---|
#include <stdio.h> main() { char a[8]="123456\n"; printf( "data=%s\n" , a); a[2]='\0'; printf( "data=%s\n" , a); printf( "data=%s\n" , "123456"); printf( "data=%s\n" , "123456" + 2); printf( "data=%s\n" , "12 789"); printf( "data=%sです。\n" , ""); printf( "data=%s\n" , " %d"); } |
data=123456 data=12 data=123456 data=3456 data=12 789 data=です。 data= %d |
putsは単純にchar * 型引数が一つだけで、
'\0'が出現する直前まで出力した後に'\n'の改行を追加出力します。
つまり、printf( "%s\n" , 文字列データ);と
puts( 文字列データ);はまったく同じ出力をします。
以下に簡単な例を示します。
(上記printf例の第二引数と同じデータをputsの第一引数にした例です)
プログラム | 実行結果 |
---|---|
#include <stdio.h> main() { char a[8]="123456\n"; puts( a ); a[2]='\0'; puts( a ); puts( "123456" ); puts( "123456" + 2 ); puts( "12 789" ); puts( "" ); puts( " %d" ); } |
123456 12 123456 3456 12 789 %d |
文字列を処理する内部的なプログラムイメージの参考→ここのクリック