ArduinoのStringクラスは、arduino-0019からコアに加えられた機能です。Stringクラスも従来の配列型と同じく文字列の操作が行えます。
Stringクラス
Stringクラスでも文字列の操作が行えますが、その利点と欠点等を以下にまとめてみます。
利点
配列型の文字列よりも複雑な連結、追加、置換、検索といった操作が可能です。
欠点
配列型より多くのメモリを消費します。
備考
ダブルクオーテーションマークで囲まれた文字列定数は、これまでどおり配列として処理されます。
Stringクラスの書式
Stringクラスのコンストラクタの書式は下記の通りです。コンストラクタとは、インスタンス(Stringクラスのオブジェクト)を生成する宣言と思えば良いでしょう。
1 2 3 4 5 6 7 8 9 |
//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クラスを使用する事が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//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クラスに用意されている文字列操作関数のサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
//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クラスの文字列操作演算子の使い方の例をあげておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//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