Arduino-文字列

文字列はテキストを格納するために使用されます。LCDまたはArduinoIDEシリアルモニターウィンドウにテキストを表示するために使用できます。文字列は、ユーザー入力を保存するのにも役立ちます。たとえば、Arduinoに接続されたキーパッドでユーザーが入力する文字。

Arduinoプログラミングには2種類の文字列があります-

  • Cプログラミングで使用される文字列と同じ文字の配列。
  • スケッチで文字列オブジェクトを使用できるようにするArduino文字列。

この章では、文字列、オブジェクト、およびArduinoスケッチでの文字列の使用について学習します。この章の終わりまでに、スケッチで使用する文字列のタイプを学習します。

文字列文字配列

学習する最初のタイプの文字列は、そのタイプの一連の文字である文字列です。 char。前の章では、配列とは何かを学びました。メモリに格納されている同じタイプの変数の連続シリーズ。文字列はchar変数の配列です。

文字列は、文字列の最後に1つの追加要素があり、常に値が0(ゼロ)である特別な配列です。これは「ヌル終了文字列」として知られています。

文字列文字配列の例

この例では、文字列を作成してシリアルモニターウィンドウに出力する方法を示します。

Example

void setup() {
   char my_str[6]; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str[0] = 'H'; // the string consists of 5 characters
   my_str[1] = 'e';
   my_str[2] = 'l';
   my_str[3] = 'l';
   my_str[4] = 'o';
   my_str[5] = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

次の例は、文字列が何で構成されているかを示しています。印刷可能な文字と配列の最後の要素として0を含む文字配列。これは、文字列が終了する場所であることを示します。文字列は、を使用してArduinoIDEシリアルモニターウィンドウに印刷できます。Serial.println() 文字列の名前を渡します。

この同じ例は、以下に示すように、より便利な方法で記述できます。

Example

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

このスケッチでは、コンパイラは文字列配列のサイズを計算し、文字列をゼロで自動的にnullで終了します。6要素の長さで、5文字の後にゼロが続く配列は、前のスケッチとまったく同じ方法で作成されます。

文字列配列の操作

次のスケッチに示すように、スケッチ内の文字列配列を変更できます。

void setup() {
   char like[] = "I like coffee and cake"; // create a string
   Serial.begin(9600);
   // (1) print the string
   Serial.println(like);
   // (2) delete part of the string
   like[13] = 0;
   Serial.println(like);
   // (3) substitute a word into the string
   like[13] = ' '; // replace the null terminator with a space
   like[18] = 't'; // insert the new word
   like[19] = 'e';
   like[20] = 'a';
   like[21] = 0; // terminate the string
   Serial.println(like);
}

void loop() {

}

結果

I like coffee and cake
I like coffee
I like coffee and tea

スケッチは次のように機能します。

文字列の作成と印刷

上記のスケッチでは、新しい文字列が作成され、シリアルモニターウィンドウに表示するために印刷されます。

文字列を短くする

文字列の14番目の文字をヌル終了ゼロ(2)に置き換えることにより、文字列が短縮されます。これは、0から数えて文字列配列の要素番号13です。

文字列が印刷されると、すべての文字が新しいnullで終了するゼロまで印刷されます。他の文字は消えません。それらはまだメモリに存在し、文字列配列は同じサイズのままです。唯一の違いは、文字列を処理する関数は、最初のnullターミネータまでの文字列のみを参照することです。

文字列内の単語を変更する

最後に、スケッチは「ケーキ」という単語を「お茶」に置き換えます(3)。文字列が最初に作成された形式に復元されるように、最初にlike [13]のnullターミネータをスペースに置き換える必要があります。

新しい文字は、単語「cake」の「cak」を単語「tea」で上書きします。これは、個々の文字を上書きすることによって行われます。「cake」の「e」は、新しいnull終了文字に置き換えられます。その結果、文字列は実際には2つのヌル文字で終了します。元の文字は文字列の最後にあり、新しい文字は「cake」の「e」を置き換えます。文字列を出力する関数は、最初のnullターミネータに遭遇すると文字列文字の出力を停止するため、これは新しい文字列が出力されるときに違いはありません。

文字列配列を操作する関数

前のスケッチでは、文字列内の個々の文字にアクセスすることにより、手動で文字列を操作しました。文字列配列の操作を簡単にするために、独自の関数を記述して操作するか、からの文字列関数の一部を使用できます。C 言語ライブラリ。

S.No. 機能と説明
1

String()

バージョン0019のコアの一部であるStringクラスを使用すると、文字配列よりも複雑な方法でテキストの文字列を使用および操作できます。文字列を連結したり、文字列に追加したり、部分文字列を検索して置換したりすることができます。単純な文字配列よりも多くのメモリを必要としますが、より便利です。

参考までに、文字配列は「s」が小さい文字列と呼ばれ、Stringクラスのインスタンスは大文字のSが付いた文字列と呼ばれます。「二重引用符」で指定された定数文字列はchar配列として扱われることに注意してください。 Stringクラスのインスタンスではありません

2

charAt()

文字列の特定の文字にアクセスします。

3

compareTo()

2つの文字列を比較し、一方が他方の前後にあるかどうか、またはそれらが等しいかどうかをテストします。文字列は、文字のASCII値を使用して、文字ごとに比較されます。つまり、たとえば、「a」は「b」の前にありますが、「A」の後にあります。数字は文字の前にあります。

4

concat()

パラメータを文字列に追加します。

5

c_str()

文字列の内容をCスタイルのnullで終了する文字列として変換します。これにより、内部文字列バッファに直接アクセスできるため、注意して使用する必要があることに注意してください。特に、返されたポインタを使用して文字列を変更しないでください。Stringオブジェクトを変更した場合、またはオブジェクトが破棄された場合、以前にc_str()によって返されたポインターは無効になるため、使用しないでください。

6

endsWith()

文字列が別の文字列の文字で終わるかどうかをテストします。

7

equals()

2つの文字列が等しいかどうかを比較します。比較では大文字と小文字が区別されます。つまり、文字列「hello」は文字列「HELLO」と等しくありません。

8

equalsIgnoreCase()

2つの文字列が等しいかどうかを比較します。比較では大文字と小文字は区別されません。つまり、String( "hello")はString( "HELLO")と同じです。

9

getBytes()

文字列の文字を指定されたバッファにコピーします。

10

indexOf()

別の文字列内の文字または文字列を検索します。デフォルトでは、文字列の先頭から検索しますが、特定のインデックスから開始することもできるため、文字または文字列のすべてのインスタンスを見つけることができます。

11

lastIndexOf()

別の文字列内の文字または文字列を検索します。デフォルトでは、文字列の末尾から検索しますが、特定のインデックスから逆方向に機能することもできるため、文字または文字列のすべてのインスタンスを見つけることができます。

12

length()

文字列の長さを文字数で返します。(これには末尾のヌル文字が含まれないことに注意してください。)

13

remove()

指定されたインデックスから文字列の末尾まで、または指定されたインデックスからインデックスとカウントに文字を削除する文字列をその場で変更します。

14

replace()

文字列replace()関数を使用すると、特定の文字のすべてのインスタンスを別の文字に置き換えることができます。replaceを使用して、文字列の部分文字列を別の部分文字列に置き換えることもできます。

15

reserve()

文字列reserve()関数を使用すると、文字列を操作するためのバッファをメモリに割り当てることができます。

16

setCharAt()

文字列の文字を設定します。文字列の既存の長さ以外のインデックスには影響しません。

17

startsWith()

文字列が別の文字列の文字で始まるかどうかをテストします。

18

toCharArray()

文字列の文字を指定されたバッファにコピーします。

19

substring()

文字列の部分文字列を取得します。開始インデックスは包括的です(対応する文字は部分文字列に含まれます)が、オプションの終了インデックスは排他的です(対応する文字は部分文字列に含まれません)。終了インデックスを省略した場合、部分文字列は文字列の最後まで続きます。

20

toInt()

有効な文字列を整数に変換します。入力文字列は整数で始まる必要があります。文字列に整数以外の数値が含まれている場合、関数は変換の実行を停止します。

21

toFloat()

有効な文字列をfloatに変換します。入力文字列は数字で始まる必要があります。文字列に数字以外の文字が含まれている場合、関数は変換の実行を停止します。たとえば、文字列「123.45」、「123」、および「123fish」は、それぞれ123.45、123.00、および123.00に変換されます。「123.456」は123.46で近似されていることに注意してください。floatの精度は10進数で6〜7桁しかないため、長い文字列は切り捨てられる可能性があることにも注意してください。

22

toLowerCase()

文字列の小文字バージョンを取得します。1.0以降、toLowerCase()は、新しい文字列を返すのではなく、その場で文字列を変更します。

23

toUpperCase()

文字列の大文字バージョンを取得します。1.0以降、toUpperCase()は、新しい文字列を返すのではなく、その場で文字列を変更します。

24

trim()

先頭と末尾の空白を削除したバージョンの文字列を取得します。1.0以降、trim()は、新しい文字列を返すのではなく、その場で文字列を変更します。

次のスケッチでは、いくつかのC文字列関数を使用しています。

void setup() {
   char str[] = "This is my string"; // create a string
   char out_str[40]; // output from string functions placed here
   int num; // general purpose integer
   Serial.begin(9600);

   // (1) print the string
   Serial.println(str);

   // (2) get the length of the string (excludes null terminator)
   num = strlen(str);
   Serial.print("String length is: ");
   Serial.println(num);

   // (3) get the length of the array (includes null terminator)
   num = sizeof(str); // sizeof() is not a C string function
   Serial.print("Size of the array: ");
   Serial.println(num);

   // (4) copy a string
   strcpy(out_str, str);
   Serial.println(out_str);

   // (5) add a string to the end of a string (append)
   strcat(out_str, " sketch.");
   Serial.println(out_str);
   num = strlen(out_str);
   Serial.print("String length is: ");
   Serial.println(num);
   num = sizeof(out_str);
   Serial.print("Size of the array out_str[]: ");
   Serial.println(num);
}

void loop() {

}

結果

This is my string
String length is: 17
Size of the array: 18
This is my string
This is my string sketch.
String length is: 25
Size of the array out_str[]: 40

スケッチは次のように機能します。

文字列を印刷する

新しく作成された文字列は、前のスケッチで行ったように、シリアルモニターウィンドウに印刷されます。

文字列の長さを取得する

strlen()関数は、文字列の長さを取得するために使用されます。文字列の長さは印刷可能な文字専用であり、ヌルターミネータは含まれていません。

文字列には17文字が含まれているため、シリアルモニターウィンドウに17文字が出力されます。

配列の長さを取得する

演算子sizeof()は、文字列を含む配列の長さを取得するために使用されます。長さにはヌルターミネータが含まれているため、長さは文字列の長さより1つ長くなります。

sizeof()は関数のように見えますが、技術的には演算子です。これはC文字列ライブラリの一部ではありませんが、配列のサイズと文字列のサイズ(または文字列の長さ)の違いを示すためにスケッチで使用されました。

文字列をコピーする

strcpy()関数は、str []文字列をout_num []配列にコピーするために使用されます。strcpy()関数は、渡された2番目の文字列を最初の文字列にコピーします。文字列のコピーがout_num []配列に存在しますが、配列の18個の要素しか使用しないため、配列には22個の空きchar要素が残っています。これらの空き要素は、メモリ内の文字列の後にあります。

文字列を配列にコピーして、文字列の最後に文字列を追加するスケッチの次の部分で使用するために、配列に余分なスペースを確保しました。

文字列を文字列に追加する(連結)

スケッチは、ある文字列を別の文字列に結合します。これは、連結と呼ばれます。これは、strcat()関数を使用して行われます。strcat()関数は、渡された2番目の文字列を最初に渡された文字列の末尾に配置します。

連結後、文字列の長さが出力され、新しい文字列の長さが示されます。次に、配列の長さが出力され、40要素の長さの配列に25文字の長さの文字列があることが示されます。

ヌル終了ゼロのため、25文字の長い文字列は実際には配列の26文字を占めることに注意してください。

配列の境界

文字列と配列を操作するときは、文字列または配列の範囲内で作業することが非常に重要です。スケッチの例では、文字列の操作に使用できるメモリを割り当てるために、40文字の長さの配列が作成されました。

配列のサイズが小さすぎて、配列よりも大きい文字列をコピーしようとすると、文字列は配列の最後にコピーされます。配列の終わりを超えたメモリには、スケッチで使用される他の重要なデータが含まれている可能性があり、それらは文字列によって上書きされます。文字列の終わりを超えるメモリがオーバーランすると、スケッチがクラッシュしたり、予期しない動作が発生したりする可能性があります。