答え

これだと字下げのスペースが文字列に含まれてしまう。
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;
}
実行結果
むかしむかしあるところに、おじいさんとおばあさんがすんでいました。あるひのこと、おじいさんはやまへしばかりに、おばあさんはかわへせんたくにいきましたとさ。めでたしめでたし。