Arduino で文字列を解析する

Ammar Ali 2023年10月12日
  1. Arduino で strtok() 関数を使用して文字列を解析する
  2. Arduino で substring() 関数を使用して文字列を解析する
Arduino で文字列を解析する

このチュートリアルでは、Arduino で strtok() および substring() 関数を使用して文字列を解析する方法について説明します。

Arduino で strtok() 関数を使用して文字列を解析する

文字列には、Arduino の文字、数字、および記号を含めることができます。 Arduino の strtok() 関数を使用して、文字列を分離または解析できます。

たとえば、コンマで区切られた部分文字列を含む文字列がある場合、各部分文字列をコンマで区切り、各部分文字列を個別の文字列または文字配列として保存します。

構文:

char *s = strtok(char *MyS, char *MyD);

上記のコードでは、MyS は、解析する文字列を含む定数 char 変数であり、MyD は、解析に使用する区切り文字、文字、または記号を含む定数 char 変数でもあります。 指定された文字列。 strtok() 関数は、指定された区切り文字の前の最初のトークンまたは文字の配列を返します。

最初のトークンを除く指定された文字列は strtok() 関数に保存されるため、2 番目の文字列トークンを取得するには、指定された文字列の代わりに NULL を渡す必要があります。

たとえば、文字列を定義して区切り文字と strtok() 関数を使用して区切ります。

char *MyS = "this is-delftstack.com-website";
char *MyD = "-";
void setup() {
  Serial.begin(9600);

  char *s = strtok(MyS, MyD);
  Serial.println(s);
  char *s1 = strtok(NULL, MyD);
  Serial.println(s1);
  char *s2 = strtok(NULL, MyD);
  Serial.println(s2);
}
void loop() {}

出力:

this is
delftstack.com
website

上記のコードでは、strtok() 関数を 3 回使用して、指定された文字列に存在する 3つのトークンをすべて取得し、各文字列トークンは文字配列内に格納されます。 コードを繰り返し記述する必要がないように、ループを使用して、指定された文字列に存在するすべての使用可能なトークンを取得することもできます。

setup() 関数内にコードを記述しました。これは Arduino ボードに電源を投入したときに 1 回だけ実行されますが、文字列が大きい場合は、loop() 関数内にコードを記述して繰り返すことができます。 setup() 関数内で最初のトークンを取得し、loop() 関数内で次のトークンが使用可能かどうかを確認します。

利用可能な場合は、配列内に格納し、指定された文字列内に文字列トークンがなくなるまで手順を繰り返します。

たとえば、上記の文字列を使用して、上記と同じ区切り文字を使用して、使用可能なすべての文字列トークンを見つけてみましょう。

char *MyS = "this is-delftstack.com-website-Welcome";
char *MyD = "-";
char *MyArray[10];
int i = 1;
void setup() {
  Serial.begin(9600);

  char *s = strtok(MyS, MyD);
  Serial.println(s);
  MyArray[0] = s;
}
void loop() {
  char *s1 = strtok(NULL, MyD);
  if (s1 != NULL) {
    MyArray[i] = s1;
    Serial.println(MyArray[i]);
    i = i + 1;
  }
}

出力:

this is
delftstack.com
website
Welcome

上記のコードでは、文字列トークンを格納するために使用されるサイズ 10 で配列を初期化しました。 指定された文字列に存在する文字列トークンに従って初期化できます。

また、配列内に値を格納するために使用されるインデックスも初期化しました。 loop() 関数内でインクリメントします。

if ステートメントを使用して、文字列トークンが NULL かどうかを確認しました。 NULL でない場合は、配列内に格納し、インデックスをインクリメントします。

次の文字列トークンを見つけるためにループを繰り返す必要があることに注意してください。 loop() 関数の前にすべてのトークンを取得したい場合は、setup() 関数内にループを配置できます。

loop() 関数に移る前に、すべての文字列トークンを配列内に格納します。 区切り文字は、指定された文字列に存在する任意の文字、記号、または数字にすることができ、スペースを区切り文字として使用することもできます。

Arduino で substring() 関数を使用して文字列を解析する

Arduino の substring() 関数を使用して、文字列を分離または解析することもできます。 指定されたインデックス値に従って、substring() は指定された文字列から部分文字列を分離します。

たとえば、文字列から最初の 5 文字を取得する場合、substring() 関数とインデックス値 5 を使用できます。

構文:

String s = MyS.substring(SIndex, EIndex);

上記のコードで、ssubstring() 関数の出力を格納するために使用される文字列変数で、MyS は文字列データ型の指定された文字列です。 SIndex は開始インデックスであり、EIndex は部分文字列の終了インデックスです。

たとえば、文字列を作成し、そのサブ文字列を 0 から 5 インデックスで見つけてみましょう。

String MyS = "this is delftstack.com website Welcome";

void setup() {
  Serial.begin(9600);
  String s = MyS.substring(0, 5);
  Serial.println(s);
}
void loop() {}

出力:

this

上記のコードでは、Arduino のシリアル モニタを使用して結果を表示しました。 出力からわかるように、最初の 5 文字またはインデックスがシリアル モニタ ウィンドウに表示されます。

5 番目の文字はスペース文字であるため、出力には 4 文字しか表示されません。 文字のインデックスがわからない場合は、indexOf() 関数を使用してその文字のインデックスを取得できます。

indexOf() 関数の構文:

int MyI = MyS.indexOf(char);

上記のコードでは、MyI 変数は指定された文字のインデックスである出力を格納し、char はインデックスを検索する文字です。 MyS は、指定された文字列を含む文字列変数です。

たとえば、スペースで区切られた単語の文字列があり、文字列から最初の単語を取得したいとします。 indexOf() 関数を使用してスペース文字のインデックスを見つけ、そのインデックスを substring() 関数内に渡して最初の単語を取得できます。

String MyS = "this is delftstack.com website Welcome";

void setup() {
  Serial.begin(9600);
  int MyI = MyS.indexOf(" ");
  String s = MyS.substring(0, MyI);
  Serial.println(s);
}
void loop() {}

出力:

this

上記の出力からわかるように、指定された文字列から最初の単語を抽出しました。 指定された文字列から全世界を取得したい場合は、ループを使用する必要があります。

indexOf() 関数内に 2 番目の引数を渡して開始位置を設定することもできます。これは、指定された文字のインデックスを検索するために使用されます。

たとえば、上の例で、文字列の最初の 2 語を取得したい場合、開始インデックス値を 5 に設定すると、関数は 2 番目の区切り文字のインデックス値を返します。 最初の 2つの単語を抽出します。

上記のコードの setup() 関数内にコードを記述しましたが、これは 1 回だけ実行されます。 しかし、loop() 関数内にコードを記述した場合、コードは繰り返されます。

loop() 関数内にコードを記述して、指定された文字列に存在するすべての部分文字列を見つけることができます。

たとえば、上記の文字列に存在するすべての部分文字列を見つけてみましょう。

String MyS = "this is delftstack.com website Welcome";
int MyP = 0;
int MyI = 0;
String array[10];
int index = 0;
void setup() { Serial.begin(9600); }
void loop() {
  if (MyI >= 0) {
    MyI = MyS.indexOf(" ", MyP);
    String s = MyS.substring(MyP, MyI);
    Serial.println(s);
    MyP = MyI + 1;
    array[index] = s;
    Serial.println(array[index]);
    index = index + 1;
  }
}

出力:

this
is
delftstack.com
website
Welcome

上記のコードでは、指定された区切り文字のインデックス値を if ステートメント内で使用して、指定された文字列の末尾に到達したかどうかを確認しました。 indexOf() 関数内で指定された文字列の長さを超えています。

MyPMyI の 2つの整数変数を初期化しました。これらは、以前と現在のインデックス値に使用されます。

MyP または前のインデックス値を使用して MyI または次のインデックス値を取得し、これらの値を使用して部分文字列を見つけます。 その後、MyP または前のインデックスの値を現在のインデックスに 1 を加えた値に変更して、次回ループが繰り返されるようにします。 次の単語を取得します。

また、インデックス値に従って部分文字列を格納するために、サイズ 10 の文字列配列を初期化しました。 次の部分文字列を次のインデックス値に保存するために、if ステートメントでインデックスをインクリメントします。

指定された文字列に存在するすべての部分文字列を取得するには、ループ自体を繰り返す必要があることに注意してください。 loop() 関数を開始する前に部分文字列を取得したい場合は、setup () 関数内でループを使用できます。

上記の例では区切り文字としてスペースを使用しましたが、任意の文字、記号、数字を使用して、指定された文字列を解析できます。 indexOf() および substring() 関数は Arduino の文字列クラスに属しており、文字列クラスの詳細については、この リンク を確認してください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - Arduino String