Arduino-strings

提供:Dev Guides
移動先:案内検索

Arduino-文字列

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

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

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

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

文字列文字配列

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

文字列は、文字列の末尾に1つの余分な要素を含む特別な配列であり、常に0(ゼロ)の値を持ちます。 これは「ヌル終了文字列」として知られています。

文字列文字配列の例

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

  • 例 *
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を含む文字配列。* Serial.println()*を使用して文字列の名前を渡すことにより、文字列をArduino IDEシリアルモニターウィンドウに出力できます。

この同じ例は、以下に示すように、より便利な方法で書くことができます-

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ターミネーターまでの文字列のみを見るということです。

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

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

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

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

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

以下は、文字列配列を操作する関数のリストです。

S.No. Functions & Description
1

String()

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

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

2

charAt()

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

3

compareTo()

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

4

concat()

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

5

c_str()

文字列の内容をCスタイルのヌル終了文字列として変換します。 これにより、内部文字列バッファに直接アクセスできるため、注意して使用する必要があります。 特に、返されるポインターを使用して文字列を変更しないでください。 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()

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

15

reserve()

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

16

setCharAt()

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

17

startsWith()

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

18

toCharArray()

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

19

substring()

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

20

toInt()

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

21

toFloat()

有効な文字列をフロートに変換します。 入力文字列は数字で始まる必要があります。 文字列に数字以外の文字が含まれている場合、関数は変換の実行を停止します。 たとえば、文字列「123.45」、「123」、および「123fish」は、それぞれ123.45、123.00、および123.00に変換されます。 「123.456」は123.46に近似していることに注意してください。 また、フロートの精度は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要素がまだあります。 これらの空き要素は、メモリ内の文字列の後にあります。

文字列は配列にコピーされたので、スケッチの次の部分で使用する配列に余分なスペースがあり、文字列の末尾に文字列が追加されます。

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

スケッチは1つの文字列を別の文字列に結合します。これは連結として知られています。 これは、strcat()関数を使用して行われます。 strcat()関数は、渡された2番目の文字列を、渡された最初の文字列の最後に置きます。

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

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

配列の境界

文字列と配列を使用する場合、文字列または配列の境界内で作業することが非常に重要です。 サンプルスケッチでは、文字列の操作に使用できるメモリを割り当てるために、40文字の配列が作成されました。

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