printfの%s と puts関数

printfの%s

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

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

文字列を処理する内部的なプログラムイメージの参考→ここのクリック