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 や ” “で区切られた文字列を連結する時は、空白で連結しましょう。
コメント