【プログラミングメモ】
シングルクォーテーション「'」とダブルクオーテーション「"」の違い(C言語、Arduino言語)
C言語(Arduino言語)において、シングルクォーテーション「'」とダブルクオーテーション「"」は役割が異なります。シングルクォーテーションで囲まれた文字は文字リテラル、ダブルクオーテーションで囲まれた文字列は文字列が格納されたアドレスを表します。なお、「'」は1文字を表すためだけに利用することができます。また、「"」の文字列の後には「NULL」が付け加えられます。
Arduino言語のSerial.readStringUntil関数の利用方法
Arduinoでシリアルバッファからデータを取得する Serial.readStringUntil関数を例に解説します。Serial.readStringUntil関数は引数で指定した文字、文字列が出現したら、そこまでの文字列をString型オブジェクトとして返します。
引数に文字リテラルを与える場合(OK!)
//String型文字列として取得 String s = Serial.readStringUntil( ' ' );
区切り文字として「半角スペース」を与えた場合です。問題なく動作します。
引数に文字列「"AAA"」を与える場合(コンパイルエラー)
//String型文字列として取得 String s = Serial.readStringUntil( "AAA" ); //コンパイルエラー
「"」で囲われた文字列は、文字列が格納されたメモリのアドレスを意味します。 つまり、文字列の値を「"AAA"」は文字列ではなく、文字列「AAA」が格納されたアドレスを意味するので、「AAA」文字列を指定したことになりません。
引数に文字列の値を与えるには
//String型文字列として取得 String s = Serial.readStringUntil( "*AAA" ); //意図通り動作
「"AAA"」はアドレスなので、「*」演算子をアドレスの前に加えた「*"AAA"」が値(文字列)を指します。
引数に「'AAA'」を与えた場合
1文字を表す「'」で、文字列を囲うとどうなるでしょうか?答えはコンパイルエラーにはなりませんが、意図通りの動作をしません。
//String型文字列として取得 String s = Serial.readStringUntil( 'AAA' );