從頭遍歷直到遇到 '\0',計數器即為長度(不含結尾符)。
size_t my_strlen(const char *str) {
if (!str) return 0; // 防禦性:NULL 視為長度 0
size_t len = 0;
while (str[len] != '\0') ++len;
return len;
}
size_t my_strlen_ptr(const char *str) {
if (!str) return 0;
const char *p = str;
while (*p) ++p;
return p - str;
}
int main(void) {
char s1[] = "hello"; // 5
char *s2 = "OK"; // 2
char *s3 = ""; // 0
char *s4 = NULL; // 0 (防禦)
printf("s1: %zu\n", my_strlen(s1));
printf("s2: %zu\n", my_strlen(s2));
printf("s3: %zu\n", my_strlen(s3));
printf("s4: %zu\n", my_strlen(s4));
return 0;
}
s1: 5 s2: 2 s3: 0 s4: 0
| 運算式 | 結果 | 說明 |
|---|---|---|
strlen("abc") | 3 | 運行期計數 |
sizeof("abc") | 4 | 編譯期常量大小(含 \0) |
char a[]="abc"; sizeof(a) | 4 | 陣列大小 |
char *p="abc"; sizeof(p) | 4/8 | 指標大小 |
size_t 為無號型別,格式化用 %zu (C99)。NULL 處理策略:返回 0 vs 斷言 vs 崩潰(標準庫行為未定義,防禦性返回 0 較安全)。__builtin_strlen,手寫版本僅供教學。