第05問の答え

答え

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