Arduino裏的字符串處理 上

分析字符串

isAlphaNumeric()  // 判斷是否爲字母數字

isAlpha()        // 判斷是否爲字母

isAscii()        // 判斷是否爲 ASCII 碼

isWhitespace()    // 判斷是否爲空格符

isControl()          // 判斷是否爲控制字符

isDigit()              // 判斷是否爲數字

isGraph()            // 判斷是否爲可打印的字符,不是空格

isLowerCase()       // 判斷是否爲小寫

isPrintable()        // 判斷是否爲可打印的字符

isPunct()            // 判斷是否爲標點符號

isSpace()            // 判斷是否爲空格

isUpperCase()     // 判斷是否爲大寫

isHexadecimalDigit()  // 判斷是否爲十六進制數字(i.e. 0 - 9, a - F, or A - F)

代碼示例

/*
 * Arduino 中的字符處理
 */
void setup() {
  // 打開串口通信
  Serial.begin(9600);
  while(!Serial){
    ; // 等待串口連接
    }
   Serial.println("send any byte and i'll tell you everything I can about it");
   Serial.println();
}

void loop() {
  // 獲取輸入的數據
  if (Serial.available() > 0){
    int thisChar = Serial.read();
    
    // 查看發送的內容
    Serial.print("You sent me: \'");
    Serial.print(thisChar);
    Serial.print("\'  ASCII Value: ");
    Serial.println(thisChar);
    
    // 分析發送的內容
    if(isAlphaNumeric(thisChar)){
      Serial.println("it's alphanumeric");
      }
     if(isAlpha(thisChar)){
      Serial.println("it's a alphabetic");
      }
     if(isAscii(thisChar)){
      Serial.println("it's ASCII");
       }
     if(isWhitespace(thisChar)){
      Serial.println("it's whitespace");
       }
     if(isControl(thisChar)){
       Serial.println("it's a control character");
       }
     if(isDigit(thisChar)){
       Serial.println("it's a numeric digit");
       }
      if(isGraph(thisChar)){
       Serial.println("it's a printable charcater that's not whitespace");
       }
      if(isLowerCase(thisChar)){
       Serial.println("it's  lower case");
       }
    if (isPrintable(thisChar)) {
      Serial.println("it's printable");
    }
    if (isPunct(thisChar)) {
      Serial.println("it's punctuation");
    }
    if (isSpace(thisChar)) {
      Serial.println("it's a space character");
    }
    if (isUpperCase(thisChar)) {
      Serial.println("it's upper case");
    }
    if (isHexadecimalDigit(thisChar)) {
      Serial.println("it's a valid hexadecimaldigit (i.e. 0 - 9, a - F, or A - F)");
    }

    // 添加一些空格並要求另外的字符
    Serial.println();
    Serial.println("Give me anther byte");
    Serial.println();
      }
}

字符串相加

字符串可以和(長)整數常量,(長)整數變量,字符,字符串相加,代碼如下所示:

/*
 * 字符相加
 */

String stringOne = String("You added ");
String stringTwo = String("this string");
String stringThree = String();

void setup() {
  Serial.begin(9600);

  Serial.println("\n\nAdding Strings together (concatenation):");
  Serial.println();
}

void loop() {
  // 字符串與整數常量相加
  stringThree = stringOne + 123;
  Serial.println(stringThree);

  // 字符串與長整數常量相加
  stringThree = stringOne + 123456789;
  Serial.println(stringThree);

  // 字符串與字符常量相加
  stringThree = stringOne + 'A';
  Serial.println(stringThree);

  // 字符串與字符串相加
  stringThree = stringOne + "abc";
  Serial.println(stringThree);

  stringThree = stringOne + stringTwo;
  Serial.println(stringThree);

  // 字符串與整數變量相加
  stringOne = "Sensor value: ";
  stringThree = stringOne + analogRead(A0);
  Serial.println(stringThree);

  // 字符串與長整數變量相加
  stringOne = "millis() value: ";
  stringThree = stringOne + millis();
  Serial.println(stringThree);

  while(true);
}

輸出的結果

img

添加字符串

使用 += 運算符和 concat() 方法將(長)整數常量,(長)整數變量,字符,字符串添加到字符串中去,代碼如下所示:

/*
 * 添加字符串
 */
 
String stringOne = String("Sensor ");
String stringTwo = String("value");

void setup() {
  Serial.begin(9600);
  Serial.println("\n\nAppending to a String:");
  Serial.println();
}

void loop() {
  Serial.println(stringOne);

  // 添加一個字符串
  stringOne += stringTwo;
  Serial.println(stringOne);

  stringOne += " for input ";
  Serial.println(stringOne);

  // 添加一個字符
  stringOne += 'A';
  Serial.println(stringOne);

  // 添加一個整數常量
  stringOne += 0;
  Serial.println(stringOne);

  // 添加一個整數變量
  stringOne += analogRead(A0);
  Serial.println(stringOne);


  Serial.println("\n\nchanging the Strings' values");
  stringOne = "A long integer: ";
  stringTwo = "The millis(): ";

  // 使用 concat() 來爲子婦產添加一個長變量
  stringTwo.concat(millis());
  Serial.println(stringTwo);
  
  while(true);

}

輸出結果

img

改變字符串的大小寫

可以使用 toUpperCasetoLowerCase 來分別改變字符串的大寫和小寫。只有字符 A-Z 或 a-z 受到影響,代碼示例如下所示:

/*
 * 改變字符串的大小寫
 */

void setup() {
  Serial.begin(9600);
  Serial.println("\n\nString case changes:");
  Serial.println();
}

void loop() {
  // 將所有字母更改爲大寫
  String stringOne = "<html><head><body>";
  Serial.println(stringOne);
  stringOne.toUpperCase();
  Serial.println(stringOne);

  // 將所有字母更改爲小寫
  String stringTwo = "</BODY></HTML>";
  Serial.println(stringTwo);
  stringTwo.toLowerCase();
  Serial.println(stringTwo);

  while (true);
}

輸出結果

img

設定字符串中的值

字符串函數 charAt() 用於獲取字符串中給定位置的字符值, setCharAt() 用於設置字符串中給定位置的字符值。代碼示例如下:

/*
 * 設定字符串中的值
 */

void setup() {
  Serial.begin(9600);
  Serial.println("\n\nString charAt() and setCharAt():");
}

void loop() {
  // 打印傳感器讀數
  String reportString = "SensorReading: 456";
  Serial.println(reportString);

  // 讀數的最高位數位於 reportString 中的第15位 
  char mostSignificantDigit = reportString.charAt(15);

  String message = "Most significant digit of the sensor reading is: ";
  Serial.println(message + mostSignificantDigit);
  Serial.println();

  // 將位置13 的“:” 改成 “=”
  reportString.setCharAt(13, '=');
  Serial.println(reportString);

  while(true);
}

輸出結果

img

比較字符串

字符串的中比較運算符有:==!=><>=<= 以及 equals() 方法和 equalsIgnoreCase()方法。這些運算允許在字符串之間進行字母比較。它們對於排序和按字母順序排序很有用。

其中 ==equals() 執行相同的操作:

if(stringOne.equals(stringTwo)){}
if (stringOne == stringTwo) {}

>(大於)和 <(小於)運算符按字母順序在兩者不同的第一個字符上比較字符串。因此,有“a”<“b”“1”<“2”,但 “999”>“1000” 因爲 9 比 1 大。

所以,需要注意的是,在比較數字字符串時,字符串比較運算符可能會造成混淆,因爲數字被視爲字符串而不是數字。如果需要比較數字,請將它們轉換爲整數,浮點數或長整數,而不是字符串。

獲取字符的索引

indexOf() 用來獲取字符串中指定字符的索引; lastIndexOf()用來倒序獲取指定字符的索引。如何想要獲得當前字符第二個索引,可以使用第一個結束位置的索引,並從進行 + 1搜索作爲偏移量;倒序的話,進行 -1 操作。需要注意的是,得到的結果都是正向排序的結果,代碼示例如下:

/*
 * 獲取字符串的索引
 */
 
String stringOne = String("Hello Hello");
String stringTwo = String();
String stringThree = String();

void setup() {
  Serial.begin(9600);
}

void loop() {
  // 獲取第一個“e”的索引
  int e = stringOne.indexOf('e');
  stringTwo = " the first e's index is: ";
  stringThree = stringTwo + e;
  Serial.println(stringThree);
  
  // 獲取第二個“e”的索引
  int second_e = stringOne.indexOf('e', e + 1);
  stringTwo = " the second e's index is: ";
  stringThree = stringTwo + second_e;
  Serial.println(stringThree);

  // 倒序獲得倒數第一個“o”的索引
  int last_o = stringOne.lastIndexOf('o');
  stringTwo = " the last o's index is: ";
  stringThree = stringTwo + last_o;
  Serial.println(stringThree);

  // 倒序獲得倒數第二個 “o”的索引
  int last_second_o = stringOne.lastIndexOf('o', last_o -1);
  stringTwo = " the last second o's index is: ";
  stringThree = stringTwo + last_second_o;
  Serial.println(stringThree);
  
  while(true);
}

輸出結果

img

獲取字符串的長度及消除額外元素

使用 length() 可以獲得字符串的長度,使用 trim() 可以消除多餘的空白格,代碼示例如下:

/*
 * 獲取字符串的長度
 */
 
void setup() {
  Serial.begin(9600);
}

void loop() {
  String stringOne = String("  Hello World!   ");
  Serial.println(stringOne);
  
  // 獲取字符串的長度
  Serial.print("Length: ");
  Serial.println(stringOne.length());
  
  // 消除空格後,打印響度
  stringOne.trim();
  Serial.println(stringOne);
  Serial.print("Length: ");
  Serial.println(stringOne.length());

  // 避免無限打印
  while(true);

}

輸出結果

img

替換字符串中的字符

使用 replace() 可以替換字符串中的字符,代碼示例如下:

/*
 * 替換字符串中的字符
 */

void setup() {
  Serial.begin(9600);
}

void loop() {
  String stringOne = String("Hello world");
  Serial.println(stringOne);

  // 將“world”替換成 “arduino”
  String stringTwo = stringOne;
  stringTwo.replace("world", "arduino");
  Serial.println(stringTwo);

  // 避免無限打印
  while(true);
}

輸出結果

img

檢查首尾字符

可以用 startsWith()endWith() 來檢查一個字符串是否符合要求,代碼示例如下所示:

/*
 * 檢查字符串的首尾字符
 */

void setup() {
  Serial.begin(9600);
}

void loop() {
  String stringOne = String("Hello World");
  Serial.println(stringOne);

  // 確認首字符
  if(stringOne.startsWith("Hello")){
    Serial.println("Yes");
    }

  // 確認尾字符
  if(stringOne.endsWith("World")){
    Serial.println("Yes");
    }  

   while(true);
}

輸出結果

img

查找子字符串

substring()charAt()startsWith()endsWith() 密切相關。它允許查找給定字符串中特定子字符串的實例。

void setup() {
  Serial.begin(9600);
}

void loop() {
  String stringOne = "Content-Type: text/html";
  Serial.println(stringOne);

  // substring(index)查找從索引位置到結尾的子字符串
  if (stringOne.substring(19) == "html") {
    Serial.println("It's an html file");
  }
  // 在字符串中間查找子字符串
  if (stringOne.substring(14, 18) == "text") {
    Serial.println("It's a text-based file");
  }

  while (true);
}

輸出結果

img

字符串轉換成整數

使用 toInt() 可以將字符串轉換成整數。下面代碼是將接受到的字符串中的整數字符轉換成整數:

/*
 * 字符串轉換爲整數
 */
String inString = "";

void setup() {
  Serial.begin(9600);
}

void loop() {
  // 讀取串口的輸入:
  while(Serial.available() > 0){
    int inChar = Serial.read();
    // 判斷輸入的是否爲數字
    if(isDigit(inChar)){
      // 將傳入的字節轉換爲字符並將其添加到字符串
      inString += (char)inChar;
      }
    // 如果有新的一行的話,打印字符串和字符串的值
    if(inChar == '\n'){
      Serial.print("Value: ");
      Serial.println(inString.toInt());
      Serial.print("String: ");
      Serial.println(inString);
      // 清空字符串
      inString = "";
      }
    }
}

轉自:
作者:caoqi95
鏈接:https://www.jianshu.com/p/5d4c5f318b73

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章