C语言字符串
👇😊 C语言字符串 😊👇
🌈 1. 字符串是什么?
想象你有一串珍珠项链📿,每颗珍珠代表一个字符,最后一颗是特殊的透明珠子(\0)表示项链结束。
- 本质:以
\0结尾的字符数组 - 特点:必须手动管理内存,没有自动扩容!
🌈 2. 字符串的创建与初始化
2.1 两种初始化方式
- 方式1:逐个字符初始化
1
char str1[7] = {'H', 'e', 'l', 'l', 'o', '!', '\0'}; // 必须手动加\0
- 方式2:字符串字面量(推荐 ✅)
1
char str2[] = "Hello!"; // 自动添加\0,数组长度=字符数+1 → 7
⚠️ 易错点:
1 | char str3[5] = "Hello"; ❌ // 长度不够(需要6字节:5字符+\0) |
🌈 3. 字符串的输入与输出
3.1 输入字符串
使用
scanf(有空格会截断)1
2
3char name[20];
printf("请输入名字:");
scanf("%s", name); // 输入 "Anna Smith" → 只能读取"Anna"使用
fgets(可包含空格)1
2printf("请输入全名:");
fgets(name, sizeof(name), stdin); // 输入 "Anna Smith" → 完整读取
3.2 输出字符串
1 | printf("名字是:%s\n", name); // 输出整个字符串直到遇到\0 |
🌈 4. 常用字符串函数详解
4.1 字符串长度:strlen
1 | char str[] = "Hello"; |
⚠️ 陷阱:若字符串未以 \0 结尾,strlen 会一直找直到内存中的 \0 → 导致错误!
4.2 字符串复制:strcpy
1 | char src[] = "Copy me!"; |
💥 危险操作:目标数组空间不足 → 缓冲区溢出!
1 | char dest[5]; |
✅ 安全替代:strncpy
1 | strncpy(dest, src, sizeof(dest)-1); // 限制最大复制长度 |
4.3 字符串连接:strcat
1 | char str1[20] = "Hello"; |
💥 危险操作:目标数组空间不足 → 溢出!
1 | char str1[10] = "Hello"; |
✅ 安全替代:strncat
1 | strncat(str1, str2, sizeof(str1)-strlen(str1)-1); // 计算剩余空间 |
4.4 字符串比较:strcmp
- 比较规则:按ASCII码逐个字符比较
1
2
3int result = strcmp("apple", "apple"); // 0 → 相等
int result = strcmp("apple", "banana"); // 负数 → "apple" < "banana"
int result = strcmp("zoo", "apple"); // 正数 → "zoo" > "apple"
⚠️ 易错点:不能用 == 比较字符串!
1 | if(str1 == str2) { ... } ❌ // 比较的是地址,不是内容! |
4.5 查找字符:strchr
1 | char *pos = strchr("Hello", 'l'); // 找到第一个'l'的位置 |
4.6 查找子串:strstr
1 | char *pos = strstr("Hello World", "World"); |
🌈 5. 代码实例全解析
示例代码
1 |
|
逐行解释
声明数组
str1[14]初始化为"runoob"→ 实际占用7字节(6字符 +\0)str2[14]同理str3[14]未初始化,用于存储复制结果
复制操作
strcpy- 将
str1的内容复制到str3,str3变为"runoob\0"
- 将
连接操作
strcat- 将
str2的内容追加到str1末尾 - 原
str1内容为"runoob\0"→ 追加后变为"runoobgoogle\0"(总长度12字符 +\0)
- 将
计算长度
strlen- 返回
str1中\0前的字符数 → 12
- 返回
🌈 6. 常见错误大集合
数组越界
1
char s[5] = "Hello"; ❌ // 需要6字节(5字符+\0)
忘记
\01
2char s[] = {'a', 'b', 'c'}; // 没有\0 → 不是合法字符串!
printf("%s", s); // 可能输出乱码或崩溃!使用未初始化的指针
1
2char *s;
strcpy(s, "Hello"); ❌ // s未指向有效内存!
🌈 7. 综合练习
练习1:字符串反转
写一个函数 void reverseString(char str[]),将输入的字符串原地反转。
示例:输入 "Hello" → 输出 "olleH"
练习2:统计单词数
写一个函数 int countWords(char str[]),统计字符串中的单词数(假设单词间用空格分隔)。
示例:输入 "Hello World C" → 输出3
练习3:错误修复
以下代码有什么问题?
1 | char s1[10] = "Hello"; |
🎯 参考答案
练习1:
1 | void reverseString(char str[]) { |
练习2:
1 | int countWords(char str[]) { |
练习3:
错误:s1 初始长度10,"Hello"占6字节(含\0),连接 "World!"(7字节)总长度6+6=12+1=13 → 超出s1容量!
修正:增大 s1 的容量,如 char s1[20];
🚀 总结:
- 字符串是
\0结尾的字符数组 - 操作字符串要时刻注意内存安全
- 掌握
strcpy、strcat、strcmp等函数,避免常见错误
记住:多练习调试,字符串操作会越来越熟练! 💻🔍
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Matou🚢!
评论


