■長い文字列(寿限無)
#include <stdio.h>
char *jugemu = "寿限無寿限無五劫のすり切れ海砂利水魚の水行末雲来末 風来末食う寝るところに住むところやぶら小路のぶら小路パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナの長久命の長助";
int main(void){
printf("%s\n",jugemu);
}
■短い文字列を連結して長い文字列を作る
#include <stdio.h>
char *jugemu =
"寿限無寿限無"
"五劫のすり切れ"
"海砂利水魚の水行末"
"雲来末 風来末"
"食う寝るところに住むところ"
"やぶら小路のぶら小路"
"パイポパイポ"
"パイポのシューリンガン"
"シューリンガンのグーリンダイ"
"グーリンダイのポンポコピーの"
"ポンポコナの長久命の長助";
int main(void){
printf("%s\n",jugemu);
}
■予期せぬ文字列リテラルの連結(例1)
#include <stdio.h>
static char *buf[] ={
"[0].予期せぬ",
"[1].文字列"
"[2].連結",
};
int main(void){
printf("%s\n",buf[0]);
printf("%s\n",buf[1]);
printf("%s\n",buf[2]);
}
C言語では連続する文字列リテラルは
連結されます。
つまり
”文字列A” ”文字列B”は
”文字列A文字列B”と同じです。
この問題では ”1.文字列” の後ろにカンマが無いので
“1.文字列”と”2.連結”が連結されます。
■予期せぬ文字列リテラルの連結(例2)
#include <stdio.h>
int main(void){
printf("%s:%d:%s"
__FILE__,
__LINE__,
__func__
);
}
この例では
“%s:%d:%s”の後ろにカンマが無いので
__FILE__と文字列連結し
書式%sに整数__LINE__が渡ります。
未定義動作なので結果は正確にはわかりませんが
大抵の環境では何か表示する前にプログラムが異常終了します。