[ESP32]文字列の連結について

C/C++

C++での文字列の連結について

#define や ” ” で区切られた文字列は空白スペースで連結する。

簡単そうでつまづいてしまったこと

文字列を連結する時につまづいたので残しておきます。文字列操作をしたいけどどうすればいいかわからない場合、Google検索をするとまとめてくれているサイトが多いので、非常に助かります。

ただ、これでつまづいた人はいないのでしょうか。

#define STRING_A "Hello"
#define STRING_B "World"
#define STRING_C "!!!"

void setup() {
  Serial.begin(115200);
 	Serial.println(STRING_A + STRING_B + STRING_C);
}

void loop() {
  // put your main code here, to run repeatedly:
}

Compilation error: invalid operands of types ‘const char [6]’ and ‘const char [6]’ to binary ‘operator+’

コンパイルエラーとなりダメなようです。

” “で区切られた文字列同士を連結させるときは、「+」を使用せずに空白で区切ります。

#define STRING_A "Hello"
#define STRING_B "World"
#define STRING_C "!!!"

void setup() {
  Serial.begin(115200);
 	Serial.println(STRING_A STRING_B STRING_C);
}

void loop() {
  // put your main code here, to run repeatedly:
}

これでコンパイルが通りました。

ただし、” “で区切られた文字列を一旦String型に入れた場合は、空白ではエラーとなるので「+」で連結します。

と、ここで気がつきましたが、defineで定義している文字列式の途中の” “で区切られた文字列 というのは、String型ではないですよね。

そのため、String型ではないただの文字列同士を連結させようとして、String型の連結演算子「+」を使用するとダメなんですね。片方がString型であれば、「+」を使用することでうまいこと連結してくれるようです。

色々試してみる

#define STRING_A "Hello"
#define STRING_B "World"
const String String_a = "Hello";
const String String_b = "World";

void setup() {
  Serial.begin(115200);

  // define
 	Serial.println(STRING_A + STRING_B);  // コンパイルエラー
  Serial.println(STRING_A STRING_B);
 	Serial.println("Hello" + "World");    // コンパイルエラー
  Serial.println("Hello" "World");

  // String
 	Serial.println(String_a + String_b);
  Serial.println(String_a String_b);    // コンパイルエラー

  // define と String
 	Serial.println(STRING_A + String_b);
  Serial.println(STRING_A String_b);    // コンパイルエラー
 	Serial.println("Hello" + String_b);
  Serial.println("Hello" String_b);     // コンパイルエラー
}

void loop() {
  // put your main code here, to run repeatedly:
}

なるほどー。

まとめ

知ってたら簡単ですが、知らなかったら「なんで~?」ってなります。空白でつなげるという発想が出てこずに、悩んでしまいました。

#define や ” “で区切られた文字列を連結する時は、空白で連結しましょう。

コメント

タイトルとURLをコピーしました