0Pricing
C Academy · บทเรียน

strlen, strcpy, strcat

ฟังก์ชันสตริงหลัก

strlen, strcpy, strcat เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

สตริงในภาษา C

ในภาษา C สตริงเป็นเพียงอาร์เรย์ของ char ที่ลงท้ายด้วยอักขระตัวจบสตริงแบบค่าว่าง '\0'

ฟังก์ชันใน <string.h> อาศัยตัวจบสตริงนี้เพื่อทราบว่าสตริงสิ้นสุดที่ใด หากไม่มีตัวจบสตริง ฟังก์ชันจะอ่านเลยจุดสิ้นสุดของอาร์เรย์

#include <stdio.h>

int main(void) {
    char name[] = "Alice";
    printf("%s\n", name);
    printf("Bytes used: %lu\n", sizeof(name));
    return 0;
}

การรวม string.h

หากต้องการใช้ฟังก์ชันจัดการสตริง คุณต้องรวมส่วนหัวดังนี้:

  • #include <string.h>

ส่วนหัวนี้ทำให้คุณใช้ strlen, strcpy, strcat, strcmp และฟังก์ชันอื่น ๆ ได้

#include <stdio.h>
#include <string.h>

int main(void) {
    char greeting[] = "Hello";
    printf("Length is %lu\n", strlen(greeting));
    return 0;
}

strlen: การนับอักขระ

strlen คืนค่าจำนวนอักขระที่อยู่ก่อนตัวจบสตริงแบบค่าว่าง โดยไม่นับ '\0' เอง

ดังนั้น strlen("cat") จะคืนค่า3 แม้อาร์เรย์จะใช้พื้นที่ 4 ไบต์

#include <stdio.h>
#include <string.h>

int main(void) {
    char word[] = "cat";
    printf("strlen = %lu\n", strlen(word));
    printf("sizeof = %lu\n", sizeof(word));
    return 0;
}

strlen มีความซับซ้อน O(n)

เนื่องจากสตริงในภาษา C ไม่ได้เก็บความยาวไว้ strlen จึงต้องไล่ดูอักขระทุกตัวจนกว่าจะพบ '\0'

ทำให้การดำเนินการนี้มีความซับซ้อนเป็น O(n) หลีกเลี่ยงการเรียกใช้ซ้ำ ๆ ในเงื่อนไขของลูปเมื่อจัดการกับสตริงขนาดใหญ่

#include <stdio.h>
#include <string.h>

int main(void) {
    char msg[] = "programming";
    size_t len = strlen(msg);
    for (size_t i = 0; i < len; i++) {
        printf("%c", msg[i]);
    }
    printf("\n");
    return 0;
}

strcpy: การคัดลอกสตริง

คุณไม่สามารถคัดลอกสตริงด้วย = ได้ ให้ใช้ strcpy(dest, src) ซึ่งจะคัดลอก src ไปยัง dest รวมถึงตัวจบสตริงแบบค่าว่าง

พื้นที่ปลายทางต้องใหญ่เพียงพอสำหรับข้อมูลต้นทางและตัวจบสตริง

#include <stdio.h>
#include <string.h>

int main(void) {
    char src[] = "Hello";
    char dest[20];
    strcpy(dest, src);
    printf("%s\n", dest);
    return 0;
}

อันตรายจากบัฟเฟอร์ล้นของ strcpy

หาก dest มีขนาดเล็กเกินไป strcpy จะเขียนเลยบัฟเฟอร์ ทำให้หน่วยความจำเสียหาย นี่เป็นข้อผิดพลาดด้านความปลอดภัยที่พบได้บ่อย

ควรใช้ strncpy(dest, src, n) ซึ่งคัดลอกได้ไม่เกิน n ไบต์แทน หมายเหตุ: strncpy อาจไม่เติมตัวจบสตริงแบบค่าว่าง หาก src ยาวเกินไป

#include <stdio.h>
#include <string.h>

int main(void) {
    char src[] = "LongString";
    char dest[5];
    strncpy(dest, src, 4);
    dest[4] = '\0';
    printf("%s\n", dest);
    return 0;
}

strcat: การต่อสตริง

strcat(dest, src) นำ src ไปต่อท้าย dest โดยเริ่มเขียนตั้งแต่ตำแหน่งตัวสิ้นสุดค่าว่างของ dest และเพิ่มตัวสิ้นสุดค่าว่างใหม่ที่ท้ายสตริง

dest ต้องเป็นสตริงที่ถูกต้องอยู่แล้วและมีพื้นที่ว่างเพียงพอ

#include <stdio.h>
#include <string.h>

int main(void) {
    char buffer[20] = "Hello, ";
    strcat(buffer, "World");
    printf("%s\n", buffer);
    return 0;
}

การสร้างสตริงทีละขั้น

คุณสามารถเรียก strcpy และ strcat ต่อกันเพื่อสร้างสตริงทีละส่วนได้

ควรเริ่มด้วยบัฟเฟอร์ที่กำหนดค่าเริ่มต้นแล้วเสมอ เพื่อให้ strcat ครั้งแรกพบตัวสิ้นสุดสตริงที่ถูกต้อง

#include <stdio.h>
#include <string.h>

int main(void) {
    char full[50];
    strcpy(full, "Mr. ");
    strcat(full, "John ");
    strcat(full, "Smith");
    printf("%s\n", full);
    return 0;
}

การต่อสตริงที่ปลอดภัยยิ่งขึ้นด้วย strncat

strncat(dest, src, n) จะนำอักขระจาก src มาต่อท้ายไม่เกิน n ตัว แล้วเพิ่มตัวสิ้นสุดค่าว่างให้เสมอ

วิธีนี้ช่วยป้องกันข้อมูลล้นเมื่อไม่ทราบความยาวของต้นทาง

#include <stdio.h>
#include <string.h>

int main(void) {
    char dest[16] = "Data: ";
    char src[] = "1234567890";
    strncat(dest, src, 5);
    printf("%s\n", dest);
    return 0;
}

ค่าที่ส่งกลับ

ทั้ง strcpy และ strcat ส่งกลับตัวชี้ไปยัง dest ทำให้ซ้อนการเรียกใช้ได้ แม้ว่าอาจทำให้อ่านโค้ดได้ยากขึ้น

strlen ส่งกลับค่า size_t ซึ่งเป็นชนิดไม่มีเครื่องหมาย โปรดระวังเมื่อนำไปเปรียบเทียบกับจำนวนเต็มมีเครื่องหมาย

#include <stdio.h>
#include <string.h>

int main(void) {
    char a[20] = "foo";
    char b[] = "bar";
    printf("%s\n", strcat(a, b));
    return 0;
}

ข้อผิดพลาดที่พบบ่อยในการจัดสรรหน่วยความจำ

ข้อผิดพลาดที่เกิดขึ้นบ่อยคือการลืมเผื่อ +1 สำหรับตัวสิ้นสุดค่าว่างเมื่อกำหนดขนาดบัฟเฟอร์

สำหรับสตริงที่มีความยาว n ต้องใช้พื้นที่ n + 1 ไบต์ ความยาวรวมของสตริงสองชุดที่นำมาต่อกันคือ strlen(a) + strlen(b) + 1

#include <stdio.h>
#include <string.h>

int main(void) {
    char a[] = "abc";
    char b[] = "de";
    size_t needed = strlen(a) + strlen(b) + 1;
    printf("Need %lu bytes\n", needed);
    return 0;
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับความยาวสตริง

สรุปทบทวน

คุณได้เรียนรู้ฟังก์ชันหลักใน string.h ดังนี้:

  • strlen นับจำนวนอักขระก่อน '\0' (O(n))
  • strcpy คัดลอกสตริง โดยปลายทางต้องมีขนาดใหญ่เพียงพอ
  • strcat นำข้อมูลไปต่อท้ายสตริงที่มีอยู่
  • ควรเผื่อพื้นที่สำหรับตัวสิ้นสุดค่าว่างเสมอ และเลือกใช้รูปแบบ strn* เพื่อความปลอดภัย

คำถามที่พบบ่อย

บทเรียน “strlen, strcpy, strcat” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “strlen, strcpy, strcat” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “strlen, strcpy, strcat”

ฟังก์ชันสตริงหลัก คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “strlen, strcpy, strcat” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. strlen, strcpy, strcat
  2. strcmp และการเปรียบเทียบ
  3. strtok และการแยกโทเคน
  4. memcpy และ memset
← กลับไปที่ C Academy