/*
OK, 回到字串主題, 字串也可以組成陣列, 當然可以用兩層有 NULL 的字元陣列來表示, 例如 :

char users[][5]={{'P','e','t','e','r','\0'},{'A','m','y','\0'},{'K','e','l','l','y','\0'}};

注意, 這裡第二維必須填上各字串中最長字元數 (不含 NULL), 第一維 (字串數) 則可不填, 編譯器會自動設定. 當然, 若第一維填入比最長字串還長的數也是可以的, 編譯器只讀到 NULL 便停止, 後面多出來的字元 (存的是無法預測的值) 其實是浪費的.

比較方便的賦值方式是直接用字串常數賦值 :

char users[][5]={"Peter","Amy","Kelly"};

Arduino 在 0019 版後加入了 String 型別 (其實是一種物件), 此函式庫提供許多字串函數使字串處理更方便, 參考 :

# https://www.arduino.cc/en/Reference/StringObject

也可以參考 C 語言的 string.h :

# C 語言標準函數庫分類導覽 - 字串處理 string.h


 字串函數	 說明
 length()	 傳回字串長度
 indexOf(val), indexOf(val, from)	 從左方搜尋子字串, 傳回首次出現位置索引
 lastIndexOf(val), lastIndexOf(val, from)	 從右方搜尋子字串, 傳回首次出現位置索引
 substring(from), substring(from, to)	 傳回子字串
 replace(substr1, substr2)	 將子字串 substr1 以子字串 substr2 取代
 concat(str)	 將 str 字串串接在後面
 remove(index), remove(index, count)	 刪除索引 index 到結尾之字元, 或刪除指定字元數 count
 toLowerCase()	 傳回轉成小寫後之字串
 toUpperCase()	 傳回轉成大寫後之字串
 charAt(index)	 傳回指定索引之字元
 setCharAt(index, c)	 將字串索引 index 之字元以指定字元 c 取代
 equals(str)	 是否與指定字串 str 雷同, 傳回 true/false
 equalsIgnoreCase(str)	 是否與指定字串 str 相同 (不分大小寫), 傳回 true/false
 compareTo(str)	 與 str 字串逐字比較 ASCII 字元, 雷同傳回 0, 在後傳回正值, 在前傳回負值 
 startsWith(str)	 是否以指定字串 str 開頭, 傳回 true/false
 endsWith(str)	 是否以指定字串 str 結尾, 傳回 true/false
 trim()	 清除開頭與結尾的空白字元
 toInt()	 將以數字開頭直到非數字字元之字串轉成長整數傳回
 toFloat()	 將以數字開頭直到非浮點數字元之字串轉成浮點數傳回
 reserve(bytes)	 要求保留指定 bytes 數之記

 例如 :

*/

void setup() {
  Serial.begin(9600);
  String str="Hello World!";
  Serial.println(str.length());         //輸出 12
  Serial.println(str.indexOf(" "));        //輸出 5 (有找到傳回索引)
  Serial.println(str.indexOf(" ", 6));    //輸出 -1 (沒找到傳回 -1)
  Serial.println(str.lastIndexOf("!"));  //輸出 11
  Serial.println(str.substring(6));         //輸出 World!
  Serial.println(str.substring(0,7));      //輸出 Hello W
  str.replace("World","Tony");          
  Serial.println(str);                              //輸出 Hello Tony!
  str.concat(" Good Day!");              
  Serial.println(str);                              //輸出 Hello Tony! Good Day!
  str.remove(16);                                  //從 Day 前面空格開始刪
  Serial.println(str);                              //輸出 Hello Tony! Good
  str.remove(11,5);                               //從 G 前面空格開始刪
  Serial.println(str);                              //輸出 Hello Tony!
  str.toLowerCase();                          
  Serial.println(str);                              //輸出 hello tony!
  str.toUpperCase();                  
  Serial.println(str);                              //輸出 HELLO TONY!
  Serial.println(str.charAt(1));             //輸出 E
  str.setCharAt(5,'+');                           //將空格改為 +
  Serial.println(str);                              //輸出 HELLO+TONY!
  String str2="Hello+Tony!";
  Serial.println(str.equals(str2));          //輸出 0
  Serial.println(str.equalsIgnoreCase(str2));    //輸出 1
  Serial.println(str.compareTo(str2));  //輸出 -32 (不同,  str 在前)
  Serial.println(str.compareTo("HELLO+TONY!"));   //輸出 0 (雷同)
  Serial.println(str.startsWith("HELLO"));   //輸出 1
  Serial.println(str.endsWith("TONY!"));     //輸出 1
  str=" HELLO ";
  str.trim();
  Serial.println(str.length());   //輸出 5 (已刪除前後空格)
  str="180 Days";
  Serial.println(str.toInt());     //輸出 180
  str="65.245KG";
  Serial.println(str.toFloat());  //輸出 65.25 (四捨五入到小數第二位)
}

void loop() {
}

/*
注意, 以上字串處理函式是 Arduino C 專用, 一般 C 語言沒有這些函式. 另外, 
字串串接在 Arduino C 可以像 Python/Javacript 那樣用 + 直接串接, 
在傳統 C 語言要用 strcat() 函式或指標, 不能用 +, 參考 :

# https://tw.gitbook.net/c_standard_library/c_function_strcat.html
# Arduino - 字串
*/
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3