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 อักขระเพื่อจัดสรรหน่วยความจำที่สามารถใช้จัดการกับสตริงได้

หากอาร์เรย์มีขนาดเล็กเกินไปและเราพยายามคัดลอกสตริงที่ใหญ่กว่าอาร์เรย์ไปยังอาร์เรย์สตริงจะถูกคัดลอกที่ส่วนท้ายของอาร์เรย์ หน่วยความจำที่อยู่เกินส่วนท้ายของอาร์เรย์อาจมีข้อมูลสำคัญอื่น ๆ ที่ใช้ในร่างซึ่งสตริงของเราจะเขียนทับ หากหน่วยความจำที่อยู่เกินส่วนท้ายของสตริงถูกใช้งานมากเกินไปอาจทำให้ภาพร่างเสียหายหรือทำให้เกิดพฤติกรรมที่ไม่คาดคิด