การค้นหาและแทนที่ข้อความ

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!

ดูเพิ่มเติม