C:
การต่อสตริง
วิธีทำ:
ในภาษา C สตริงเป็นอาร์เรย์ของอักขระที่ลงท้ายด้วยอักขระ null (\0
) ซึ่งแตกต่างจากในภาษาระดับสูง ภาษา C ไม่มีฟังก์ชั่นการต่อสตริงในตัว แต่คุณใช้ฟังก์ชัน strcat()
หรือ strncat()
จากไลบรารี <string.h>
นี่คือตัวอย่างง่ายๆ โดยใช้ strcat()
:
#include <stdio.h>
#include <string.h>
int main() {
char destination[50] = "Hello, ";
char source[] = "World!";
strcat(destination, source);
printf("%s\n", destination); // ผลลัพธ์ที่แสดง: Hello, World!
return 0;
}
ฟังก์ชัน strcat()
รับสองอาร์กิวเมนต์: สตริงปลายทาง (ซึ่งต้องมีพื้นที่เพียงพอสำหรับการถือผลลัพธ์ที่ต่อกัน) และสตริงต้นทาง จากนั้นมันจะเติมสตริงต้นทางเข้าไปในสตริงปลายทาง
สำหรับการควบคุมจำนวนอักขระที่ต่อกันได้มากกว่า strncat()
ถือเป็นทางเลือกที่ปลอดภัยกว่า:
#include <stdio.h>
#include <string.h>
int main() {
char destination[50] = "Hello, ";
char source[] = "World!";
int num = 3; // จำนวนอักขระที่จะต่อเข้าไป
strncat(destination, source, num);
printf("%s\n", destination); // ผลลัพธ์ที่แสดง: Hello, Wor
return 0;
}
วิธีนี้จำกัดการต่อเฉพาะอักขระ num
ตัวแรกของสตริงต้นทาง ช่วยป้องกันการล้นบัฟเฟอร์
ศึกษาลึก
ฟังก์ชัน strcat()
และ strncat()
ได้รับการรวมไว้ในไลบรารีมาตรฐานของภาษา C ตั้งแต่เริ่มแรก สะท้อนถึงลักษณะของภาษาระดับต่ำที่ต้องการการจัดการสตริงและหน่วยความจำแบบมืออาชีพ ไม่เหมือนกับภาษาโปรแกรมมิ่งสมัยใหม่มากมายที่มองสตริงเป็นวัตถุชั้นหนึ่งพร้อมตัวดำเนินการต่อสตริงในตัว (เช่น +
หรือ .concat()
) การทำเช่นนี้ของภาษา C ต้องการความเข้าใจลึกซึ้งเกี่ยวกับตัวชี้ การจัดสรรหน่วยความจำ และปัญหาที่อาจเกิดขึ้นเช่นการล้นบัฟเฟอร์
แม้ว่า strcat()
และ strncat()
จะถูกใช้กันอย่างแพร่หลาย แต่ก็มักถูกวิจารณ์ว่ามีศักยภาพในการสร้างช่องโหว่ด้านความปลอดภัยหากไม่ใช้ด้วยความระมัดระวัง การล้นบัฟเฟอร์ ที่ข้อมูลเกินกว่าหน่วยความจำที่จัดสรรไว้ อาจทำให้เกิดความผิดพลาดหรือถูกใช้ในการดำเนินการเพื่อรันโค้ดอย่างอิสระ ผลทำให้โปรแกรมเมอร์หันไปใช้ทางเลือกที่ปลอดภัยมากขึ้น เช่น snprintf()
ซึ่งให้พฤติกรรมที่คาดเดาได้มากขึ้นด้วยการจำกัดจำนวนอักขระที่เขียนลงในสตริงปลายทางตามขนาดของมัน:
char destination[50] = "Hello, ";
char source[] = "World!";
snprintf(destination + strlen(destination), sizeof(destination) - strlen(destination), "%s", source);
วิธีนี้อาจใช้คำมากขึ้นแต่ปลอดภัยกว่าอย่างมาก ชี้ให้เห็นถึงการเปลี่ยนแปลงในปฏิบัติการเขียนโปรแกรมภาษา C ให้เน้นความปลอดภัยและความคงทนมากกว่าความกระชับ
แม้จะมีความท้าทายเหล่านี้ การต่อสตริงในภาษา C เป็นทักษะพื้นฐานสำคัญสำหรับการเขียนโปรแกรมที่มีประสิทธิภาพในภาษานี้ การทำความเข้าใจถึงความซับซ้อนและความเสี่ยงที่เกี่ยวข้องเป็นกุญแจสำคัญในการเชี่ยวชาญการเขียนโปรแกรมภาษา C