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