Arduino - สตริง
สตริงใช้ในการจัดเก็บข้อความ สามารถใช้เพื่อแสดงข้อความบน LCD หรือในหน้าต่าง Arduino IDE Serial Monitor สตริงยังมีประโยชน์สำหรับการจัดเก็บอินพุตของผู้ใช้ ตัวอย่างเช่นอักขระที่ผู้ใช้พิมพ์บนแป้นพิมพ์ที่เชื่อมต่อกับ Arduino
มีสองประเภทของสตริงในการเขียนโปรแกรม Arduino -
- อาร์เรย์ของอักขระซึ่งเหมือนกับสตริงที่ใช้ในการเขียนโปรแกรม C
- Arduino String ซึ่งให้เราใช้สตริงวัตถุในภาพร่าง
ในบทนี้เราจะเรียนรู้ Strings วัตถุและการใช้สตริงในภาพร่าง Arduino ในตอนท้ายของบทคุณจะได้เรียนรู้ประเภทของสตริงที่จะใช้ในภาพร่าง
อาร์เรย์อักขระสตริง
สตริงประเภทแรกที่เราจะเรียนรู้คือสตริงที่เป็นชุดของอักขระประเภท char. ในบทที่แล้วเราได้เรียนรู้ว่าอาร์เรย์คืออะไร ชุดตัวแปรประเภทเดียวกันที่เก็บไว้ในหน่วยความจำ สตริงคืออาร์เรย์ของตัวแปรถ่าน
สตริงคืออาร์เรย์พิเศษที่มีองค์ประกอบพิเศษหนึ่งรายการที่ส่วนท้ายของสตริงซึ่งจะมีค่าเป็น 0 (ศูนย์) เสมอ ซึ่งเรียกว่า "สตริงที่สิ้นสุดด้วยค่าว่าง"
ตัวอย่างอาร์เรย์อักขระสตริง
ตัวอย่างนี้จะแสดงวิธีการสร้างสตริงและพิมพ์ไปยังหน้าต่างมอนิเตอร์แบบอนุกรม
Example
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() {
}
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าสตริงประกอบด้วยอะไร อาร์เรย์อักขระที่มีอักขระที่พิมพ์ได้และ 0 เป็นองค์ประกอบสุดท้ายของอาร์เรย์เพื่อแสดงว่านี่คือจุดที่สตริงสิ้นสุด สามารถพิมพ์สตริงออกไปยังหน้าต่าง Arduino IDE Serial Monitor ได้โดยใช้Serial.println() และส่งชื่อของสตริง
ตัวอย่างเดียวกันนี้สามารถเขียนด้วยวิธีที่สะดวกกว่าดังแสดงด้านล่าง -
Example
void setup() {
char my_str[] = "Hello";
Serial.begin(9600);
Serial.println(my_str);
}
void loop() {
}
ในร่างนี้คอมไพลเลอร์จะคำนวณขนาดของอาร์เรย์สตริงและ null โดยอัตโนมัติจะยกเลิกสตริงด้วยศูนย์ อาร์เรย์ที่มีความยาวหกองค์ประกอบและประกอบด้วยอักขระห้าตัวตามด้วยศูนย์จะถูกสร้างขึ้นในลักษณะเดียวกับในร่างก่อนหน้า
การจัดการสตริงอาร์เรย์
เราสามารถเปลี่ยนสตริงอาร์เรย์ภายในร่างดังที่แสดงในร่างต่อไปนี้
ตัวอย่าง
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() {
}
ผลลัพธ์
I like coffee and cake
I like coffee
I like coffee and tea
ภาพร่างทำงานในลักษณะต่อไปนี้
การสร้างและพิมพ์สตริง
ในภาพร่างที่ระบุข้างต้นสตริงใหม่จะถูกสร้างขึ้นจากนั้นพิมพ์เพื่อแสดงในหน้าต่าง Serial Monitor
การย่อสตริง
สตริงถูกทำให้สั้นลงโดยการแทนที่อักขระที่ 14 ในสตริงด้วยค่าว่างที่สิ้นสุดศูนย์ (2) นี่คือองค์ประกอบหมายเลข 13 ในอาร์เรย์สตริงนับจาก 0
เมื่อสตริงถูกพิมพ์อักขระทั้งหมดจะถูกพิมพ์จนถึงค่าว่างใหม่ที่สิ้นสุดศูนย์ อักขระอื่น ๆ ไม่หายไป; ยังคงมีอยู่ในหน่วยความจำและอาร์เรย์สตริงยังคงมีขนาดเท่าเดิม ข้อแตกต่างเพียงอย่างเดียวคือฟังก์ชันใด ๆ ที่ทำงานกับสตริงจะเห็นเฉพาะสตริงที่มีค่าสูงสุดเป็นตัวกำหนดค่าว่างตัวแรก
การเปลี่ยนคำในสตริง
ในที่สุดภาพร่างจะแทนที่คำว่า "เค้ก" ด้วย "ชา" (3) ก่อนอื่นจะต้องแทนที่เทอร์มิเนเตอร์ null ที่ like [13] ด้วยช่องว่างเพื่อให้สตริงคืนค่าเป็นรูปแบบที่สร้างขึ้นครั้งแรก
อักขระใหม่เขียนทับ "cak" ของคำว่า "เค้ก" ด้วยคำว่า "tea" ซึ่งทำได้โดยการเขียนทับอักขระแต่ละตัว "e" ของ "เค้ก" จะถูกแทนที่ด้วยอักขระยุติโมฆะใหม่ ผลลัพธ์ที่ได้คือสตริงถูกยกเลิกด้วยอักขระ null สองตัวโดยตัวเดิมอยู่ท้ายสตริงและสตริงใหม่ที่แทนที่ "e" ใน "เค้ก" สิ่งนี้ไม่สร้างความแตกต่างเมื่อพิมพ์สตริงใหม่เนื่องจากฟังก์ชันที่พิมพ์สตริงจะหยุดพิมพ์อักขระสตริงเมื่อพบกับตัวยุติค่าว่างตัวแรก
ฟังก์ชั่นในการจัดการอาร์เรย์สตริง
ภาพร่างก่อนหน้านี้จัดการสตริงด้วยตนเองโดยการเข้าถึงอักขระแต่ละตัวในสตริง เพื่อให้ง่ายต่อการจัดการอาร์เรย์สตริงคุณสามารถเขียนฟังก์ชันของคุณเองเพื่อทำเช่นนั้นหรือใช้ฟังก์ชันสตริงบางส่วนจากC ห้องสมุดภาษา
ส. | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | String() คลาส String ซึ่งเป็นส่วนหนึ่งของคอร์ในเวอร์ชัน 0019 ช่วยให้คุณสามารถใช้และจัดการสตริงของข้อความในรูปแบบที่ซับซ้อนกว่าอาร์เรย์อักขระ คุณสามารถต่อสตริงต่อท้ายค้นหาและแทนที่สตริงย่อยและอื่น ๆ ใช้หน่วยความจำมากกว่าอาร์เรย์อักขระธรรมดา แต่ก็มีประโยชน์มากกว่าเช่นกัน สำหรับการอ้างอิงอาร์เรย์อักขระจะเรียกว่าสตริงที่มี 's' ขนาดเล็กและอินสแตนซ์ของคลาส String จะเรียกว่าสตริงที่มีตัวพิมพ์ใหญ่ S โปรดทราบว่าสตริงคงที่ที่ระบุใน "เครื่องหมายคำพูดคู่" จะถือว่าเป็นอาร์เรย์ถ่าน ไม่ใช่อินสแตนซ์ของคลาส String |
2 | charAt() เข้าถึงอักขระเฉพาะของ String |
3 | compareTo() เปรียบเทียบสตริงสองสายโดยทดสอบว่าสตริงหนึ่งมาก่อนหรือหลังอีกสตริงหรือว่ามีค่าเท่ากัน สตริงถูกเปรียบเทียบอักขระตามอักขระโดยใช้ค่า ASCII ของอักขระ นั่นหมายความว่าตัวอย่างเช่น "a" มาก่อน "b" แต่อยู่หลัง "A" ตัวเลขมาก่อนตัวอักษร |
4 | concat() ผนวกพารามิเตอร์เข้ากับสตริง |
5 | c_str() แปลงเนื้อหาของสตริงเป็นสตริงสไตล์ C ที่สิ้นสุดด้วยค่า null โปรดทราบว่าสิ่งนี้ให้การเข้าถึงโดยตรงไปยังบัฟเฟอร์สตริงภายในและควรใช้ด้วยความระมัดระวัง โดยเฉพาะอย่างยิ่งคุณไม่ควรแก้ไขสตริงผ่านตัวชี้ที่ส่งกลับ เมื่อคุณแก้ไขอ็อบเจ็กต์ String หรือเมื่อถูกทำลายตัวชี้ใด ๆ ที่ส่งกลับมาก่อนหน้านี้โดย c_str () จะไม่ถูกต้องและไม่ควรใช้อีกต่อไป |
6 | endsWith() ทดสอบว่า String ลงท้ายด้วยอักขระของ String อื่นหรือไม่ |
7 | equals() เปรียบเทียบสองสตริงเพื่อความเท่าเทียมกัน การเปรียบเทียบจะคำนึงถึงตัวพิมพ์เล็กและใหญ่ซึ่งหมายความว่า String "hello" ไม่เท่ากับ String "HELLO" |
8 | equalsIgnoreCase() เปรียบเทียบสองสตริงเพื่อความเท่าเทียมกัน การเปรียบเทียบไม่คำนึงถึงขนาดตัวพิมพ์ซึ่งหมายความว่า String ("hello") เท่ากับ String ("HELLO") |
9 | getBytes() คัดลอกอักขระของสตริงไปยังบัฟเฟอร์ที่ให้มา |
10 | indexOf() ค้นหาอักขระหรือสตริงภายในสตริงอื่น โดยค่าเริ่มต้นจะค้นหาจากจุดเริ่มต้นของ String แต่ยังสามารถเริ่มต้นจากดัชนีที่กำหนดเพื่อให้สามารถค้นหาอินสแตนซ์ทั้งหมดของอักขระหรือ String ได้ |
11 | lastIndexOf() ค้นหาอักขระหรือสตริงภายในสตริงอื่น โดยค่าเริ่มต้นจะค้นหาจากส่วนท้ายของ String แต่ยังสามารถทำงานย้อนกลับจากดัชนีที่กำหนดเพื่อให้สามารถค้นหาอินสแตนซ์ทั้งหมดของอักขระหรือ String ได้ |
12 | length() ส่งกลับความยาวของ String เป็นอักขระ (โปรดทราบว่าสิ่งนี้ไม่รวมอักขระ null ต่อท้าย) |
13 | remove() แก้ไขในสถานที่สตริงที่ลบอักขระออกจากดัชนีที่ให้ไว้ไปยังจุดสิ้นสุดของสตริงหรือจากดัชนีที่ให้มาเพื่อนับดัชนีบวก |
14 | replace() ฟังก์ชัน String replace () ช่วยให้คุณสามารถแทนที่อินสแตนซ์ทั้งหมดของอักขระที่กำหนดด้วยอักขระอื่น คุณยังสามารถใช้การแทนที่เพื่อแทนที่สตริงย่อยของสตริงด้วยสตริงย่อยอื่น |
15 | reserve() ฟังก์ชัน String reserve () ช่วยให้คุณสามารถจัดสรรบัฟเฟอร์ในหน่วยความจำสำหรับจัดการสตริง |
16 | setCharAt() ตั้งค่าอักขระของ String ไม่มีผลกับดัชนีที่อยู่นอกความยาวที่มีอยู่ของ String |
17 | startsWith() ทดสอบว่า String เริ่มต้นด้วยอักขระของ String อื่นหรือไม่ |
18 | toCharArray() คัดลอกอักขระของสตริงไปยังบัฟเฟอร์ที่ให้มา |
19 | substring() รับสตริงย่อยของสตริง ดัชนีเริ่มต้นรวมอยู่ด้วย (อักขระที่เกี่ยวข้องจะรวมอยู่ในสตริงย่อย) แต่ดัชนีสิ้นสุดที่เป็นทางเลือกเป็นเอกสิทธิ์ (อักขระที่เกี่ยวข้องไม่รวมอยู่ในสตริงย่อย) หากไม่ใส่ดัชนีสิ้นสุดสตริงย่อยจะต่อไปที่จุดสิ้นสุดของสตริง |
20 | toInt() แปลงสตริงที่ถูกต้องเป็นจำนวนเต็ม สตริงอินพุตควรเริ่มต้นด้วยตัวเลขจำนวนเต็ม หากสตริงมีตัวเลขที่ไม่ใช่จำนวนเต็มฟังก์ชันจะหยุดดำเนินการแปลง |
21 | toFloat() แปลงสตริงที่ถูกต้องเป็น float สตริงอินพุตควรเริ่มต้นด้วยตัวเลข หากสตริงมีอักขระที่ไม่ใช่ตัวเลขฟังก์ชันจะหยุดดำเนินการแปลง ตัวอย่างเช่นสตริง "123.45" "123" และ "123fish" จะถูกแปลงเป็น 123.45, 123.00 และ 123.00 ตามลำดับ โปรดทราบว่า "123.456" มีค่าประมาณ 123.46 โปรดทราบด้วยว่าการลอยมีทศนิยมเพียง 6-7 หลักเท่านั้นและสตริงที่ยาวกว่านั้นอาจถูกตัดทอน |
22 | toLowerCase() รับ String เวอร์ชันตัวพิมพ์เล็ก ณ วันที่ 1.0 toLowerCase () แก้ไขสตริงแทนการส่งคืนใหม่ |
23 | toUpperCase() รับ String เวอร์ชันตัวพิมพ์ใหญ่ ณ วันที่ 1.0 toUpperCase () แก้ไขสตริงแทนการส่งคืนสตริงใหม่ |
24 | trim() รับเวอร์ชันของ String ที่มีการลบช่องว่างนำหน้าและต่อท้าย ณ วันที่ 1.0 trim () แก้ไขสตริงแทนการส่งคืนสตริงใหม่ |
ร่างถัดไปใช้ฟังก์ชันสตริง C
ตัวอย่าง
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() {
}
ผลลัพธ์
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
ภาพร่างทำงานในลักษณะต่อไปนี้
พิมพ์สตริง
สตริงที่สร้างขึ้นใหม่จะพิมพ์ไปยังหน้าต่าง Serial Monitor ตามที่ทำในภาพร่างก่อนหน้านี้
รับความยาวของสตริง
ฟังก์ชัน strlen () ใช้เพื่อรับความยาวของสตริง ความยาวของสตริงมีไว้สำหรับอักขระที่พิมพ์ได้เท่านั้นและไม่รวมเทอร์มิเนเตอร์ว่าง
สตริงประกอบด้วยอักขระ 17 ตัวดังนั้นเราจึงเห็น 17 พิมพ์ในหน้าต่าง Serial Monitor
รับความยาวของอาร์เรย์
ตัวดำเนินการ sizeof () ใช้เพื่อรับความยาวของอาร์เรย์ที่มีสตริง ความยาวมีตัวบอกเลิกโมฆะดังนั้นความยาวจึงมากกว่าความยาวของสตริง
sizeof () ดูเหมือนฟังก์ชัน แต่ในทางเทคนิคแล้วเป็นตัวดำเนินการ ไม่ใช่ส่วนหนึ่งของไลบรารีสตริง C แต่ถูกใช้ในแบบร่างเพื่อแสดงความแตกต่างระหว่างขนาดของอาร์เรย์และขนาดของสตริง (หรือความยาวสตริง)
คัดลอกสตริง
ฟังก์ชัน strcpy () ใช้เพื่อคัดลอกสตริง str [] ไปยังอาร์เรย์ out_num [] ฟังก์ชัน strcpy () คัดลอกสตริงที่สองที่ส่งผ่านไปยังสตริงแรก ขณะนี้สำเนาของสตริงมีอยู่ในอาร์เรย์ out_num [] แต่ใช้เพียง 18 องค์ประกอบของอาร์เรย์ดังนั้นเราจึงยังมีองค์ประกอบถ่าน 22 องค์ประกอบฟรีในอาร์เรย์ องค์ประกอบฟรีเหล่านี้พบได้หลังสตริงในหน่วยความจำ
สตริงถูกคัดลอกไปยังอาร์เรย์เพื่อที่เราจะได้มีพื้นที่พิเศษในอาร์เรย์เพื่อใช้ในส่วนถัดไปของร่างซึ่งเป็นการเพิ่มสตริงที่ส่วนท้ายของสตริง
ต่อท้ายสตริงเข้ากับสตริง (เชื่อมต่อกัน)
ร่างรวมสตริงหนึ่งเข้ากับอีกสตริงหนึ่งซึ่งเรียกว่าการเรียงต่อกัน ทำได้โดยใช้ฟังก์ชัน strcat () ฟังก์ชัน strcat () ทำให้สตริงที่สองส่งผ่านไปยังจุดสิ้นสุดของสตริงแรกที่ส่งผ่านไป
หลังจากเชื่อมต่อแล้วความยาวของสตริงจะถูกพิมพ์เพื่อแสดงความยาวสตริงใหม่ จากนั้นความยาวของอาร์เรย์จะถูกพิมพ์เพื่อแสดงว่าเรามีสตริงยาว 25 อักขระในอาร์เรย์แบบยาว 40 องค์ประกอบ
โปรดจำไว้ว่าสตริงยาว 25 อักขระใช้อักขระ 26 ตัวของอาร์เรย์เนื่องจากค่าว่างสิ้นสุดศูนย์
ขอบเขตอาร์เรย์
เมื่อทำงานกับสตริงและอาร์เรย์สิ่งสำคัญอย่างยิ่งที่จะต้องทำงานภายในขอบเขตของสตริงหรืออาร์เรย์ ในภาพร่างตัวอย่างอาร์เรย์ถูกสร้างขึ้นซึ่งมีความยาว 40 อักขระเพื่อจัดสรรหน่วยความจำที่สามารถใช้จัดการกับสตริงได้
หากอาร์เรย์มีขนาดเล็กเกินไปและเราพยายามคัดลอกสตริงที่ใหญ่กว่าอาร์เรย์ไปยังอาร์เรย์สตริงจะถูกคัดลอกที่ส่วนท้ายของอาร์เรย์ หน่วยความจำที่อยู่เกินส่วนท้ายของอาร์เรย์อาจมีข้อมูลสำคัญอื่น ๆ ที่ใช้ในร่างซึ่งสตริงของเราจะเขียนทับ หากหน่วยความจำที่อยู่เกินส่วนท้ายของสตริงถูกใช้งานมากเกินไปอาจทำให้ภาพร่างเสียหายหรือทำให้เกิดพฤติกรรมที่ไม่คาดคิด