Arduino sscanf 関数
このチュートリアルでは、Arduino で sscanf()
関数を使用して、文字配列または文字列からフォーマットされたデータを読み取る方法について説明します。
Arduino sscanf()
関数
数値、記号、文字、およびその他のデータをテキスト ファイルまたは文字列ファイルに保存できます。 sscanf()
関数を使用して、テキスト、文字列、または文字配列から特定の形式でデータを読み取ることができます。
sscanf()
関数の基本的な構文は次のとおりです。
sscanf(char *data, char *format, ...);
上記のコードでは、data
には、2 番目の引数で定義された形式を使用して読み取る特定の文字列または文字配列が含まれています。 フォーマットを定義したら、フォーマットされたデータを保存する変数の数をリストできます。
たとえば、イベントの日付を含む文字列があり、日付、月、年を分けて、別々の変数に格納したいとします。 以下のコードを参照してください。
char *data = "28 April 2022";
int date = 0;
int year = 0;
char month[10];
void setup() {
Serial.begin(9600);
Serial.println(data);
sscanf(data, "%2d %s %4d", &date, month, &year);
Serial.println(date);
Serial.println(month);
Serial.println(year);
}
void loop() {}
出力:
28 April 2022
28
April
2022
上記のコードで、指定された文字列を格納するために data
変数を作成しました。 date
、year
、および month
変数は、日、年、および月の値を個別に格納します。
month
変数をサイズ 10 で初期化しましたが、変数に保存したい特定の文字列に従ってサイズを変更できます。 Serial.begin()
関数を使用して、結果を表示するために使用する Arduino のシリアル モニターを初期化しました。
整数値を取得するには、%d
記号を使用します。数字 2 は、読み取りたい数字の数を定義します。 %s
記号を使用して文字列を取得すると、空白までの文字が返されます。
指定された文字列にスペースがない場合は、%c
と数値を使用して、読み取る文字数を指定できます。 %s
を使用することはできません。空白がないため、予期した結果が返されません。
フォーマットの後、結果を整数で保存するには &
記号を使用する必要があり、文字列または文字配列の場合は変数名のみを使用する必要があります。 上記の例では、空白を区切り文字として使用してデータをフォーマットしましたが、任意の文字、記号、または数字を使用することもできます。
たとえば、日付文字列内の空白の代わりにカンマがあるとします。
必要な結果を抽出するには、sscanf()
関数内で空白の代わりにコンマを使用する必要があります。 また、文字列に空白が存在しないため、%s
記号の代わりに %c
記号を使用する必要があります。
たとえば、上記の例を別の区切り文字で繰り返してみましょう。 以下のコードを参照してください。
char *data = "28,April,2022";
int date = 0;
int year = 0;
char month[10];
void setup() {
Serial.begin(9600);
Serial.println(data);
sscanf(data, "%2d,%5c,%4d", &date, month, &year);
Serial.println(date);
Serial.println(month);
Serial.println(year);
}
void loop() {}
出力:
28,April,2022
28
April
2022
上記のコードの sscanf()
関数内で %5c
シンボルを使用しているのは、5 文字だけを読み取りたいからです。 5 文字を超えると、次の出力が変わります。
ご覧のとおり、出力は最初の例の出力と同じです。 浮動小数点数の場合は %f
、8 進数の場合は %o
、16 進数の場合は %x
、符号なし整数の場合は %u
など、他の記号を使用してデータをフォーマットすることもできます。