答え
これだと字下げのスペースが文字列に含まれてしまう。
puts(
"むかしむかしあるところに、\
おじいさんとおばあさんがすんでいました。\
あるひのこと、おじいさんはやまへしばかりに、\
おばあさんはかわへせんたくにいきましたとさ。\
めでたしめでたし。"
);
こうやって字下げするのが正解!
puts(
"むかしむかしあるところに、"
"おじいさんとおばあさんがすんでいました。"
"あるひのこと、おじいさんはやまへしばかりに、"
"おばあさんはかわへせんたくにいきましたとさ。"
"めでたしめでたし。"
);
解説
C言語では、連続する文字列リテラルは結合されます。つまり、ダブルクオート("
)で囲まれたテキストは、2つ以上に分割して書いても意味が変わらないということです。
これを知っていれば、長い文字列でもきれいに書けるようになるのよ。
まぁ、そうですかねぇ……。
あら、あまり納得してない顔ね。
なんというか、メリットが少なくないですか?
たしかに。長い文字列を分けたいときなんて、そんなにないものね。
そうですよ!そこが引っかかってたんです!
それじゃあ、応用編のテクニックを教えちゃおうかしら。
やったー!
ここで、応用例を一つ紹介しましょう。以下は第04問のプログラムを、文字列リテラルが結合されることを活かして書き直したものです。
main.c
#include <stdio.h>
#include <stdlib.h>
#define GREETING_MESSAGE(NAME) ("Hello, " NAME "!")
int main(void) {
puts(GREETING_MESSAGE("Leo"));
return EXIT_SUCCESS;
}
実行結果
Hello, Leo!
たしか、あいさつを表示するプログラムでしたよね。
そうね。
GREETING_MESSAGE()
で、文字列が結合されているのが分かるかしら?
ええと、ちょっと考えてみますね……。
GREETING_MESSAGE()
の中身はこうだから……
"Hello, " NAME "!"
NAME
のところに名前が入って……
"Hello, " "Leo" "!"
3つの文字列が結合されるのか!
"Hello, Leo!"
正解!いろいろと応用がきくテクニックだということが、分かってもらえたかしら?
はい!おぼえておくと、いろいろ使えそうですね。
ここがポイント!
ダブルクオートで囲まれた文字列は、続けて書くと結合される!
修正後のプログラム
main.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts(
"むかしむかしあるところに、"
"おじいさんとおばあさんがすんでいました。"
"あるひのこと、おじいさんはやまへしばかりに、"
"おばあさんはかわへせんたくにいきましたとさ。"
"めでたしめでたし。"
);
return EXIT_SUCCESS;
}
実行結果
むかしむかしあるところに、おじいさんとおばあさんがすんでいました。あるひのこと、おじいさんはやまへしばかりに、おばあさんはかわへせんたくにいきましたとさ。めでたしめでたし。