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