Arduino Tutorial (Part 12): Strings

arduino316

String được dùng để lưu trữ text (văn bản). Chúng có thể được dùng để hiển thị đoạn văn bản trên LCD hoặc trong cửa sổ Arduino IDE Serial Monitor. String hữu dụng trong việc lưu trữ thông tin người dùng nhập vào. Ví dụ, các ký tự mà người dùng gõ tữ bàn phím nối với Arduino.

Có 2 loại string trong chương trình Arduino

  • Mảng các ký tự, các mà giống như Strings trong ngôn ngữ C.
  • Arduino String, là string object trong sketch.

Trong chương này, chúng ta sẽ học String, Objects và sử dụng string trong Arduino sketch. Kết thúc chương này, bạn sẽ học các loại của string dùng trong sketch.

String Character Arrays

Loại đầu tiên của string chúng ta sẽ học là string mà chuỗi các ký tự là loại char. Trong chapter trước, chúng ta học về mảng là gì (array); mỗi chuỗi liên tiếp các biến chung một loại được lưu trong bộ nhớ. Một string là array của các biến char.

String là một mảng đặc biệt có một thành phần mở rộng để kết thúc một chuỗi, thành phần này luôn có giá trị là 0 (zero). Nó được gọi là “null terminated string”.

Ví dụ về String Character Array

Ví dụ sau sẽ trình bày cách để tạo ra một string và print no ra cửa sổ serial monitor.

Ví dụ

void setup() {
   char my_str[6]; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str[0] = 'H'; // the string consists of 5 characters
   my_str[1] = 'e';
   my_str[2] = 'l';
   my_str[3] = 'l';
   my_str[4] = 'o';
   my_str[5] = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

Ví dụ sau sẽ trình bày string được tạo thành cái gì; một mảng ký tự (dạng có thể print được) và 0 là ký tự cuối cùng của mạng đó là nơi kết thúc của string. String có thể được in ra ngoài cửa sổ Arduino IDE Serial Monitor bằng cách dùng Serial.println() và truyền tên của string.

Ví dụ

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

Trong sketch này, compiler tính toán kích thước của mảng string và tự động thêm ký tự kết thúc null vào tring với giá trị 0. Một mảng có sáu phần tử và chứa năm ký tự theo sau bởi một zero.

Vận dụng String Arrays

Chúng ta có thể thay đổi string array với một sketch như dưới đây

Ví dụ

void setup() {
   char like[] = "I like coffee and cake"; // create a string
   Serial.begin(9600);
   // (1) print the string
   Serial.println(like);
   // (2) delete part of the string
   like[13] = 0;
   Serial.println(like);
   // (3) substitute a word into the string
   like[13] = ' '; // replace the null terminator with a space
   like[18] = 't'; // insert the new word
   like[19] = 'e';
   like[20] = 'a';
   like[21] = 0; // terminate the string
   Serial.println(like);
}

void loop() {

}

Kết quả

I like coffee and cake
I like coffee
I like coffee and tea

Sketch trên sẽ hoạt động như sau

Tạo và Print String

Trong sketch ở trên, có một chuỗi mới được tạo và sau đó được print để hiển thị trong cửa sổ Serial Monitor.

Cắt ngắn String

String được cắt ngắn bằng cách thay thế ký tự thứ 14 trong string với một null terminating zero (2). Đây là thành phần số 13 trong array (chuỗi) đếm từ 0.

Khi string được print, tất cả các ký tự được print cho tới khi gặp null terminating zero mới. Các ký tự không xuất hiện; chúng vẫn tồn tại trong memory và mảng string vẫn giống kích thước. Chỉ khác là bất cứ hàm nào làm việc với string sẽ chỉ thấy string tới ký tự null termninator đầu tiên.

Thay đổi một Từ trong String

Sketch trên thay thế từ “cake” với “tea” (3). Nó trước tiên phải thay thế null terminator tại thành phần[13] với một space của string.

Ký tự mới viết đè “cak” của từ “cake” bằng từ “tea”. Điều này được làm bằng cách viết đè từng ký tự riêng biêt. ‘e’ của từ “cake” được thay thế với một ký tự null terminating.

Các hàm và vận dụng String Array

Trong sketch trước đã vận dụng string bằng cách thủ công bằng việc thay đổi từng ký tự của string. Để làm chuyện này dễ dàng hơn, bạn có thể viết một function (hàm) của chính bạn, hoặc sử dụng các thư viện chuẩn của C.

 

Ví dụ

void setup() {
   char str[] = "This is my string"; // create a string
   char out_str[40]; // output from string functions placed here
   int num; // general purpose integer
   Serial.begin(9600);

   // (1) print the string
   Serial.println(str);

   // (2) get the length of the string (excludes null terminator)
   num = strlen(str);
   Serial.print("String length is: ");
   Serial.println(num);

   // (3) get the length of the array (includes null terminator)
   num = sizeof(str); // sizeof() is not a C string function
   Serial.print("Size of the array: ");
   Serial.println(num);

   // (4) copy a string
   strcpy(out_str, str);
   Serial.println(out_str);

   // (5) add a string to the end of a string (append)
   strcat(out_str, " sketch.");
   Serial.println(out_str);
   num = strlen(out_str);
   Serial.print("String length is: ");
   Serial.println(num);
   num = sizeof(out_str);
   Serial.print("Size of the array out_str[]: ");
   Serial.println(num);
}

void loop() {

}

Kết quả

This is my string
String length is: 17
Size of the array: 18
This is my string
This is my string sketch.
String length is: 25
Size of the array out_str[]: 40

Sketch trên sẽ hoạt động như sau

Print the String

Tạo mới một string và được print ra cửa sổ Serial Monitor như sketch trước.

Lấy độ dài của String

Hàm strlen() được dùng để lấy độ dài của string. Độ dài của string cho số lượng các ký tự có thể print được và không bao gồm null terminator.

String chứa 17 ký tự, vì vậy chúng ta thấy số 17 được print ra cửa sổ Serial Monitor.

Lấy độ dài của Mảng (Array)

Toán tử sizeof() được dùng để lấy độ dài của mảng chứa string. Độ dài này bao gồm cả null terminator, vì vậy độ dài này sẽ nhiều hơn 1 so với độ dài của string.

sizeof() như một hàm, nhưng về kỹ thuật nó là một toán tử. No không phải là một phần của thư viện string của C, nhưng nó dùng trong sketch để trình bày sự khác nhau của kích thước màng và kích thước của string (độ dài của string).

Copy một String

Hàm strcpy() được dùng để copy string str[] vào mảng out_num[]. Hàm strcpy() copy chuỗi thứ 2 truyền vào bên trong chuỗi thứ nhất. Copy của một string giờ đã tồn tại trong mảng out_num[], nhưng chỉ mất 18 phần tử của mảng, vì vậy chúng ta có 22 thành phần còn trống trong mảng. Những thành phần còn trống này nằm sau string trong memory.

Thêm một String vào một String (Concatenate)

Sketch sẽ nối một string vào một cái khác (là concatenation). Điều này được làm bằng cách dùng hàm strcat(). Hàm strcat() đặt string thứ 2 truyền cho đến hết chuỗi thứ nhất.

Sau khi ghép nối, độ dài của string được print và hiển thị độ dài của string mới. Độ dài của mảng được print ra để chỉ cho chúng ta rằng có 25 ký tự string trong 40 thành phần của mảng.

Hãy nhớ rằng 25 ký tự string thực sự chiếm 26 thành phần của mảng vì có một null terminating zero.

Giới hạn của Array

Khi làm việc với string và array, điều quan trọng là làm việc với tới hạn của string hoặc array. Trong sketch ví dụ, một array được tạo, nó có độ dài 40 ký tự, để chiếm một vùng nhớ trong memory.

Nếu array được tạo quá nhỏ, chúng ta cố gắng copy một string quá lớn so với mảng, string sẽ được copy đến hết mảng. Memory vượt ngoài array có thể chứ các dự liệu quan trong của sketch, nó có thể bị viết đè bởi string của bạn. Nếu memory vượt ngoài string bị tràn, có thể xảy ra crash sketch hoặc sinh ra các hiện tượng không mong muốn.

Các bài cùng tutorial

Bài 01: Giới thiệu
Bài 02: Tổng quan
Bài 03: Arduino Board
Bài 04: Arduino IDE
Bài 05: Cấu Trúc Chương Trình
Bài 06: Data Types
Bài 07: Biến & Hằng số
Bài 08: Toán tử
Bài 09: Control Statements
Bài 10: Vòng lặp
Bài 11: Functions
Bài 12: Strings
Bài 13: String Object
Bài 14: Time
Bài 15: Arrays

Nguồn: tutorialspoint.com

Comments

linhkienbachkhoa

Comments