ฟังก์ชัน strlen()
strlen() คืนค่า **จำนวนตัวอักษรใน String** (ไม่นับ Null Terminator \0) อยู่ใน <string.h>
ไวยากรณ์
size_t strlen(const char *str);
ตัวอย่างที่ 1: ใช้ strlen()
#include <stdio.h>
#include <string.h>
int main() {
char name[25];
size_t length;
printf("Enter your name: ");
fgets(name, sizeof(name), stdin);
name[strcspn(name, "\n")] = '\0'; // ลบ newline
length = strlen(name);
printf("Your name is: %s\n", name);
printf("Length of string: %zu\n", length);
return 0;
}
ผลลัพธ์:
Enter your name: Tutorialspoint
Your name is: Tutorialspoint
Length of string: 14
ตัวอย่างที่ 2: หาความยาว String ไม่ใช้ strlen()
#include <stdio.h>
int main() {
char string[50];
int i = 0;
printf("Enter string: ");
scanf("%49s", string); // อ่าน 1 คำ (หยุดที่ space)
// นับจนกว่าจะเจอ Null Terminator
while (string[i] != '\0')
i++;
printf("Length of string: %d\n", i);
return 0;
}
ผลลัพธ์:
Enter string: TutorialsPoint
Length of string: 14
ข้อสังเกตสำคัญ
strlen()นับ **จำนวนตัวอักษร** ไม่ใช่ขนาด Array- Time Complexity: O(n) - ต้องวนลูปจนเจอ
\0 - คืนค่า
size_t(Unsigned) ควรใช้%zuใน printf sizeof(array)≠strlen(string)- sizeof ให้ขนาด Array ทั้งหมด (รวม \0 และพื้นที่ว่าง)
ตัวอย่าง sizeof vs strlen
char str[20] = "Hello";
printf("sizeof: %zu\n", sizeof(str)); // 20 (ขนาด Array)
printf("strlen: %zu\n", strlen(str)); // 5 (ความยาว String)
Best Practice
- ใช้
strlen()จาก Library (Optimized แล้ว) - หลีกเลี่ยงการเรียก
strlen()ใน Loop Condition (คำนวณซ้ำทุกรอบ) → เก็บไว้ในตัวแปรก่อน - เช็ค NULL Pointer ก่อนเรียกใช้
Bad vs Good
// ❌ Bad: เรียก strlen ทุกรอบ O(n²)
for (int i = 0; i < strlen(s); i++) { ... }
// ✅ Good: คำนวณครั้งเดียว O(n)
size_t len = strlen(s);
for (size_t i = 0; i < len; i++) { ... }