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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- strlen, strcpy, strcat
- strcmp และการเปรียบเทียบ
- strtok และการแยกโทเคน
- memcpy และ memset