結論から言うと、
printf関数に書式指定文字列%sを指定した場合、引数の番地が指す文字からヌル文字(\0)までを表示するから
です。
上記を理解するための前提知識が必要になります。
以下を読んでください。
C言語で char str[5]; などと配列を宣言した場合、strと記述すると配列の先頭番地 &str[0]を省略して記述したことになります。(←これをC言語入門当時知らなかった!)
この省略形は、printf関数の%s書式でよく利用されますが、strが&str[0]の省略形であるという説明が省略(笑)されていたりするので、「そういうもんだ」で終わらせている人も多いかと思います。
&って何だ?という方はC言語のポインタについて理解を深めてください。
ポインタはコンピュータのメモリに関しての話です。
もう少し具体的に説明します。
次のプログラムを例にとります。
#include <stdio.h> int main(void) { char str[] = "Hello!"; printf("%s", str); return 0; }
表示結果
Hello!
通常printf関数で、文字列表示する場合、上記のように%sの書式指定文字列を指定します。
char型の配列を%sで表示したいときは、配列名だけ記述すればいいよ、とどこかで見たのですがどうも腑に落ちませんでした。
自分でprintfをちょっと修正してみたら腑に落ちました。
#include <stdio.h> int main(void) { char str[] = "Hello!"; printf("%s", &str[0]); return 0; }
表示結果
Hello!
strはもともと省略形なので、引数にchar型配列strの先頭番地 &str[0] を指定しても結果は同じです。
ではこれはどうだ?と考えて更に修正したのが以下のプログラムです。
#include <stdio.h> int main(void) { char str[] = "Hello!"; printf("%s", &str[2]); return 0; }
配列の3番目の番地(&str[2])をあえて指定してみました。
表示結果
llo!
配列のstr[2]に代入されている文字からヌル文字(\0)までが表示されていることが分かります。
printf関数の%s動作イメージを図にするとこんな感じです。
printf関数の%s書式は、引数の指す番地の内容から\0までを表示する命令だったのです。
コメント