Z
ZHANK
数组与字符串

C 风格字符串

字符数组与 '' 终结符、字符串字面量、输入安全

C 风格字符串

C 没有 String 类——字符串就是一个以 '\0'(空字符)结尾的 char 数组。这个简单的设计带来了极大的灵活性和极大的风险。

学完本章你将: 理解 '\0' 的作用、字符数组 vs 指针、安全输入。


字符串的本质

c
#include <stdio.h>

int main() {
    char s[] = "Hello";
    // 实际存储: 'H' 'e' 'l' 'l' 'o' '\0'
    // 数组长度: 6(不是 5!)

    printf("sizeof = %zu\n", sizeof(s));  // 6
    printf("%s\n", s);

    return 0;
}

💡 '\0' 是字符串的终止符,ASCII 值为 0。所有字符串函数都依赖它找到末尾。忘了 '\0' 会导致函数读越界,产生不可预测的行为。


三种声明方式

c
// 方式 1:字符数组(可修改)
char s1[] = "Hello";
s1[0] = 'h';               // ✅ 可修改

// 方式 2:字符数组指定大小
char s2[20] = "Hello";     // 剩余空间为 '\0'

// 方式 3:指针指向字面量(不可修改!)
char *s3 = "Hello";
// s3[0] = 'h';            // ❌ 段错误!字面量存于只读区
`char[]``char*`
存储位置指针在栈,字符串在只读区
可修改❌(未定义行为)
sizeof数组大小指针大小(4 或 8)

安全输入

c
// ❌ 危险:无缓冲区保护
char name[10];
scanf("%s", name);  // 输入超 10 个字符 → 溢出!
gets(name);         // 从来都不要用 gets,C11 已删除

// ✅ 安全:限制长度
scanf("%9s", name);  // 最多读 9 个,留 1 个给 '\0'

// ✅ 推荐:用 fgets
fgets(name, sizeof(name), stdin);