Arduino入門:Stringクラス

ArduinoのStringクラスは、arduino-0019からコアに加えられた機能です。Stringクラスも従来の配列型と同じく文字列の操作が行えます。

Stringクラス

Stringクラスでも文字列の操作が行えますが、その利点と欠点等を以下にまとめてみます。

利点
配列型の文字列よりも複雑な連結、追加、置換、検索といった操作が可能です。

欠点
配列型より多くのメモリを消費します。

備考
ダブルクオーテーションマークで囲まれた文字列定数は、これまでどおり配列として処理されます。

Stringクラスの書式

Stringクラスのコンストラクタの書式は下記の通りです。コンストラクタとは、インスタンス(Stringクラスのオブジェクト)を生成する宣言と思えば良いでしょう。

//Arduino Sketch Example: Straing Class, Syntax of Constructor
//Date: 2015.1.12
//Auther: easy labo

//Syntax
String(value)
String(value, base) 
//value: character, integer, string, etc. 
//base: BIN, DEC, HEX

数値からインスタンスを生成すると、その値(10進数)をASCII文字で表現したものになります。また、Syntax(書式)は2種類あり、base(基数)がある方は、様々なデータ型の値を何進数表記か選択して文字列化し、インスタンスを生成することができます。この場合、数値等のデータ型を何進数表記で文字列化する指定オプションが、base(基数)となります。

Stringクラスの使用例

次の例の様にしてStringクラスを使用する事が可能です。

//Arduino Sketch Example: Straing Class, Object Constructors
//Date: 2015.1.12
//Edited and Modified by: easy labo
//Original Source: Arduino Reference (http://arduino.cc/en/Reference/HomePage)

String strBufA = "easy labo";   // (A)using a constant String
String strBufB =  String('A');  // (B)converting a constant char into a String
String strBufC =  String("StringC");  // (C)converting a constant string into a String object
String strBufD =  String( StringC + " with more");  // (D) concatenating two strings
String strBufE =  String(8);  // (E)using a constant integer
String strBufF =  String(analogRead(0), DEC); // (F)using an int and a base
String strBufG =  String(24, HEX);  // (G)using an int and a base (hexadecimal)
String strBufH =  String(128, BIN);  // (H)using an int and a base (binary)
String strBufI =  String(millis(), DEC); // (I)using a long and a base

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:String-Object” by Arduino Team, used under CC BY-SA 3.0/ easy labo made some changes and comments to the original

(A) 文字列定数”easy labo”をStringクラスのオブジェクトstrBufAに代入しています。
(B) 文字定数’A’をStringクラスのオブジェクトstrBufBに代入しています。
(C) 文字列定数”StringC”をStringクラスのオブジェクトstrBufCに代入しています。
(D) をStringクラスのオブジェクトstrBufCと文字列定数” with more”を連結して、StringクラスのオブジェクトstrBufDに代入しています。
(E) 整数定数8をStringクラスのオブジェクトstrBufEに代入しています。strBufEの内容は、文字の’8’になります。
(F) analogRead(0)の10進数値を、StringクラスのオブジェクトstrBufFに文字列化して代入しています。
(G) 10進整数定数24の16進数値を、StringクラスのオブジェクトstrBufGに文字列化して代入しています。
(H) 10進整数定数128の2進数値を、StringクラスのオブジェクトstrBufHに文字列化して代入しています。
(I) millis()の戻り値(long型)の10進数値を、StringクラスのオブジェクトstrBufIに文字列化して代入しています。

Stringクラスの文字列操作関数

Stringクラスの魅力は、やはり豊富な文字列操作関数と言えます。次の例は、Stringクラスに用意されている文字列操作関数のサンプルです。

//Arduino Sketch Example: Straing Class, String Character Functions
//Date: 2015.1.12
//Edited and Modified by: easy labo
//Original Source: Arduino Reference (http://arduino.cc/en/Reference/HomePage)

//char string.charAt(int n)
String strBuf = "ABCDEF";
Serial.println(strBuf.charAt(1)); // return 'B'

//int string1.compareTo(string string2)
String strBuf = "abc";
Serial.println(strBuf.compareTo("abb"));  // retrun 1
Serial.println(strBuf.compareTo("abc"));  // return 0
Serial.println(strBuf.compareTo("abd"));  // return -1

//string string1.concat(string string2)
String strBuf = "abc";
strBuf.concat("def");  //strBuf = strBuf + string2
Serial.println(strBuf);  //return "abcdef"

//int* string.c_str()
string strBuf = "Hello, world";
Serial.begin (115200);
Serial.println (strBuf.c_str ()); //c_str returns a pointer to the C-style version of the invoking string.

//boolean string1.endsWith(string string2)
boolean chkEnd;
String strBuf = "abcde";
chkEnd = strBuf.endsWith("de");  // return true
chkEnd = strBuf.endsWith("ef");  // return false

//boolean string1.equals(string string2)
boolean sameString;
String strBuf = "AbCdE";
sameString = strBuf.equals("AbCdE");  // return true
sameString = strBuf.equals("abcde");  // return false

//booelan string1.equalsIgnoreCase(string string2)
boolean sameString;
String strBuf = "AbCdE";
sameString = strBuf.equalsIgnoreCase("AbCdE");  // return true
sameString = strBuf.equalsIgnoreCase("abcde");  // return true
sameString = strBuf.equalsIgnoreCase("bcdef");  // return false

//byte string.getBytes(byte buffer, int length)
String strBuf = "ABCD";
byte byteBuf;
strBuf.getBytes(byteBuf,5);  // byteBuf is ABCD

//int string1.indexOf(string string2, int from)
String strBuf = "abcdefg";
Serial.println(strBuf.indexOf("ef"));  // return 4
Serial.println(strBuf.indexOf("jk"));  // return -1
Serial.println(strBuf.indexOf("ef"),2); // return 4
Serial.println(strBuf.indexOf("ef"),5); // return -1

//int string1.lastIndexOf(string string2, int from)
String strBuf = "abcdefghijk";
Serial.println(strBuf.lastIndexOf('e', 8));  // return 4
Serial.println(strBuf.lastIndexOf('e', 3));  // return -1

//int string.length()
String strBuf = "abcdefghi";
Serial.println(strBuf.length());  // return 9

//string string.remove(int index)
//string string.remove(int index, int count)
String strBufA = "abcdefg";
String strBufB;
String strBufC;
strBufB = strBufA.remove(2); //setBufB = "abdefg"
strBufC = strBufA.remove(2,2); //strBufC = abefg"

//string string.replace(string substring1, string substring2)
String strBuf = "abcdefg";
Serial.println(strBuf.replace("de", "DE"));  // return abcDEfg

//void string.reserve(int size)
String strBuf;
strBuf.reserve(26); //buffer size is 26 byte
strBuf = "i=";
strBuf += "1234";
strBuf += ", is that ok?";

//boolean string1.startsWith(string string2)
boolean firstStr;
String strBuf = "abcde";
firstString = strBuf.startsWith("ab");  // return true
firstString = strBuf.startsWith("ef");  // return false

//string string.substring(int from, int to)
String strBuf = "abcdefgh";
Serial.println(strBuf.substring(3));  // return defgh
Serial.println(strBuf.substring(3, 5));  // return de

//string string.setCharAt(int index, char c)
String strBuf = "abcdefg";
strBuf.setCharAt(2, 'C');
Serial.println(strBuf); // return abCdefg

//string string.toCharArray(byte buffer, int length)
String strBuf = "ABCD";
byte byteBuf;
strBuf.toCharArray(byteBuf,5);  // byteBuf is ABCD

//int string.toInt()
String strBuf = "123"
int intBuf;
intBuf = strBuf.toInt(); // intBuf = 123

//float string.toFloat()
String strBufA = "123.45";
String strBufB = "123";
String strBufC = "123.456";
String strBufD = "123abc";
float fltBufA = strBufA.toFloat();  //fltBufA = 123.45
float fltBufB = strBufB.toFloat();  //fltBufB = 123.00
float fltBufC = strBufC.toFloat();  //fltBufC = 123.45
float fltBufD = strBufD.toFloat();  //fltBufD = 123.00

//string string.toLowerCase()
String strBuf = "AbCdE";
Serial.println(strBuf.substring(3));  // return abcde

//string string.toUpperCase() 
String strBuf = "AbCdE";
Serial.println(strBuf.substring(3));  // return ABCDE

//string string.trim()
String strBuf1 = "\n abc \n";
String strBuf2 = strBuf1.trim();
Serial.print(strBuf2);  // return abc

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:String-Object” by Arduino Team, used under CC BY-SA 3.0/ easy labo made some changes and comments to the original

各々の関数の機能概要は次の通りです。
charAt(n) : n+1番目の文字要素を返します。
compareTo : 文字列を比較して、同じなら0を返します。
concat : 文字列を結合します。
c_str : ストリングクラスの文字列をC言語スタイルの文字配列+終端文字’\0’の形式に変換します。戻り値が、ポインタ渡しになりますので注意が必要です。
endsWith : 文字列の終わりから文字配列要素を比較し、等しければtrueを返します。
equals : 文字列を比較し、等しければtrueを返します。
equalsIgnoreCase : 大文字小文字を区別せずに文字列を比較し、等しければtrueを返します。
getBytes : 文字列をbyte型の配列にコピーします。上例のint lengthはbyte bufferのサイズです。
indexOf : 先頭から文字列を検索し、見つかった場合はそのインデックスを返します
lastIndexOf : 末尾から文字列を検索し、見つかった場合はそのインデックスを返します。
length : オブジェクトの文字数を返します。
remove : 文字列の一部を削除します。
replace : 文字列を置換します。
reserve : ストリング操作の為のメモリサイズ(byte)を指定する事が出来ます。
setCharAt : インデックスで指定した位置の文字を置き換えます。string長を超えたインデックスを指定した場合は無視されます。
startsWith : 先頭の文字列が指定文字列と等しい場合、trueを返します。
substring : 指定インデックスからの文字列の一部を返します。
toCharArray : 文字列をbyte型配列にコピーします。
toInt : 文字列をint型整数に変換します。文字列に整数以外が含まれる場合は実行されません。
toFloat :文字列をfloat型に変換します。文字列に数以外がある場合、その部分の処理が無視されます。
toLowerCase : 大文字を小文字に変換します。元の文字列は変化しません。
toUpperCase : 小文字を大文字に変換します。元の文字列は変化しません。
trim : 文字列の先頭と末尾の空白を削除します。

実際の使用方法については、上記サンプルコードを参考にして下さい。

Stringクラスの文字列操作演算子

Stringクラスの文字列操作演算子の使い方の例をあげておきます。

//Arduino Sketch Example: Straing Class, String Operators
//Date: 2015.1.12
//Edited and Modified by: easy labo
//Original Source: Arduino Reference (http://arduino.cc/en/Reference/HomePage)

//String Index
String strBuf = "abcd";
strBuf[2] = 'C';
Serial.println(strBuf);  // return abCd

//String Addition Operator
String strBuf1 = "ab";
String strCuf2 = "cd";
strBuf1 += 12;
Serial.println(strBuf1);  // return ab12
Serial.println(strBuf1 + strBuf2); // return ab12cd

//==
//This is the same as string.equals()
String strBuf1 = "abc";
String strBuf2 = "abc";
String strBuf3 = "abd";

boolean sameString;
if(strBuf1 == stringBuf2){
   sameString = true; // return true
}else{
   sameString = false;
}

if(strBuf1 == stringBuf3){
   sameString = true;
}else{
   sameString = false; // return false
}

Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
Arduino Reference:String-Object” by Arduino Team, used under CC BY-SA 3.0/ easy labo made some changes and comments to the original

index : 配列と同じようにインデックスで文字にアクセスできます。インデックスは、0から始まります。
+ :文字列を連結します。string.concat()と同じです。
== :2つの文字列を比較し、一致するときはtrue、異なるときはfalseを返します。string.equals()と同じです。

まとめ

Stringオブジェクトを使用すると、文字列の複雑な操作が楽に行えます。ただし配列型より多くのメモリを消費しますので、文字列の操作が単純な場合は、配列を用いた方が良いと言えます。

→その他のArduino関連情報

Sponsored Link