■この記事の概要
この記事では、C言語で長い文字列リテラルを複数行に分割して記述する方法を解説しています。改行記号や特別な記号を使う必要がなく、分かりやすく安全にコーディングできます。また、誤った連結や非推奨な記述例を示し、推奨されるスタイルを具体例とともに紹介しています。
■長い文字列リテラル(寿限無)
#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__が渡ります。
未定義動作なので結果は正確にはわかりませんが
大抵の環境では何か表示する前にプログラムが異常終了します。
■長いprintf()(非推奨)
#include <stdio.h>
int main(void){
printf("大富豪\t%05d\n富豪\t%04d\n平民\t%03d\n貧民\t%02d\n大貧民\t%01d\n",5,4,3,2,1);
}
このprintfは横に長く読みづらく、
出力をイメージするのが困難です。
■文字列連結を使って縦に書く
#include <stdio.h>
int main(void){
printf(
"大富豪 %05d\n"
"富豪 %04d\n"
"平民 %03d\n"
"貧民 %02d\n"
"大貧民 %01d\n",/*文字列連結される*/
5,
4,
3,
2,
1
);
}
文字列連結機能を使うと横に長い文字列を
分解して縦にも書けます。
文字列連結する所では
カンマ(、)も円(¥)も不要です。
■printf()を分ける(推奨)
#include <stdio.h>
int main(void){
printf("大富豪 %05d\n",5);
printf("富豪 %04d\n",4);
printf("平民 %03d\n",3);
printf("貧民 %02d\n",2);
printf("大貧民 %01d\n",1);
}
./a.out
大富豪 00005
富豪 0004
平民 003
貧民 02
大貧民 1
printfを複数回コールした、
出力をイメージしやすい書き方です。
関数コールのオーバーヘッドで
処理が遅くなるとか気にせず
コードの読みやすさを気にしましょう。