Arduino:
การค้นหาและแทนที่ข้อความ
วิธีการ:
Arduino ไม่ได้รองรับการค้นหาและแทนที่สตริงโดยธรรมชาติในลักษณะเดียวกับภาษาโปรแกรมระดับสูง อย่างไรก็ตาม, คุณสามารถทำงานกับอาร์เรย์ของตัวอักษรหรือใช้คลาส String
ซึ่งมีเมธอด replace()
. ทั้งนี้, วิธีแรกจะประหยัดหน่วยความจำ แต่วิธีที่สองจะง่ายกว่า ลองมุ่งเน้นที่คลาส String
เพื่อความชัดเจน
void setup() {
Serial.begin(9600);
String text = "I like apples and apples are great!";
text.replace("apples", "oranges");
Serial.println(text);
}
void loop() {
// ที่นี่ไม่ต้องทำอะไร
}
ผลลัพธ์ตัวอย่าง:
I like oranges and oranges are great!
การศึกษาเจาะลึก
ในสมัยก่อน งานด้านการดำเนินการกับสตริงบนไมโครคอนโทรลเลอร์เป็นเรื่องที่หาได้ยาก — หน่วยความจำมีจำกัดและแอพพลิเคชั่นง่ายกว่า แต่ในปัจจุบัน ด้วยโปรเจกต์ที่ซับซ้อนขึ้นและพื้นที่หน่วยความจำที่มากขึ้น (ขอบคุณการพัฒนาเทคโนโลยีไมโครคอนโทรลเลอร์) ยูทิลิตี้เหล่านี้จึงกลายเป็นมาตรฐาน
หากคุณไม่ต้องการใช้คลาส String
เนื่องจากการใช้หน่วยความจำแบบไดนามิกซึ่งอาจทำให้เกิดการแบ่งส่วน คุณยังคงสามารถค้นหาและแทนที่ในสตริงแบบ C (อาร์เรย์ของตัวอักษรที่จบด้วย null) โดยใช้ฟังก์ชันเช่น strchr()
, strstr()
, และการคัดลอกหรือการแทนที่ด้วยลูปแบบด้วยมือ วิธีนี้อาจมีความยุ่งยากมากขึ้นแต่ให้ความควบคุมเรื่องหน่วยความจำได้ดีขึ้น
ตัวอย่างเช่น, วิธีอื่นในการแทนที่สับสตริงอาจดูเช่นนี้:
void replaceSubstring(char *input, const char *search, const char *replace) {
char buffer[100];
char *p;
// 'strstr' ตรวจสอบว่า 'search' เป็นส่วนหนึ่งของ 'input' หรือไม่
if (!(p = strstr(input, search))) return;
// คัดลอกจนถึงจุดที่พบ 'search'
strncpy(buffer, input, p - input);
buffer[p - input] = '\0';
// ต่อท้าย 'replace' และส่วนที่เหลือของ 'input' หลังจาก 'search'
sprintf(buffer+(p - input), "%s%s", replace, p + strlen(search));
// แสดงผลลัพธ์
strcpy(input, buffer);
}
void setup() {
Serial.begin(9600);
char text[] = "I like apples and apples are great!";
replaceSubstring(text, "apples", "oranges");
Serial.println(text);
}
void loop() {
// ที่นี่ก็ยังไม่ต้องทำอะไร
}
ผลลัพธ์ตัวอย่าง:
I like oranges and oranges are great!