前言
c语言没有字符串类型。
所有字符串都是依靠:char 连续字符序列 + \0 结束符模拟实现。
绝大多数字符串 bug、乱码、越界、段错误,根源只有一个:缺少 \0 结束符。
一、单个字符 char(底层本质)
- char 本质是 1 字节整型,存的是 ascii 码,字符只是显示形式。
- 单引号 ' ':只能存一个字符,对应 %c 输出。
char c = 97; char c = 'a'; // 两句完全等价
二、c语言字符串唯一标准(必考核心)
合法字符串 = 连续 char 数组 + 末尾必须带 \0(ascii=0)
所有字符串函数全部依赖 \0 终止:
- %s 打印
- strlen、strcpy、strcmp 等
没有 \0 —— 就不是字符串,只是普通字符数组,使用字符串函数必然越界乱码。
三、字符数组的两种身份(最容易混淆)
1. 普通字符数组(非字符串)
无 \0,不能用 %s、strlen。
char arr[] = {'1','2','3','4','5','6'};2. 合法字符串(带 \0)
char arr[] = {'1','2','3','4','5','6','\0'};3. 双引号初始化(编译器自动补 \0)
char arr[] = "123456";
内存真实存储:1 2 3 4 5 6 \0,共 7 字节。
存储在栈区,内容可修改。
四、经典错题深度解析
char str[6] = "123456";
这行代码错误!
原因:"123456" 是 7 字节(6字符+1隐藏\0),但数组只有 6 字节。
结果:
- 放不下 \0,丢失结束符
- 不再是合法字符串
- 使用 %s、strlen 一定会内存越界
正确写法:
char str[7] = "123456"; char str[] = "123456"; // 推荐,自动计算长度
五、字符串常量 "" 完整规则
- 双引号包裹的都是 字符串常量
- 原生类型:const char[n]
- 存放位置:只读常量区,不可修改
- 自带隐藏 \0,无需手动写
六、数组退化规则(底层核心)
字符串常量本来是数组 const char[n],绝大多数场景自动退化为指针 const char*。
只有 3 种情况不退化(保留数组属性):
- sizeof("xxx")
- &"xxx"
- char arr[] = "xxx"; 数组初始化
七、字符串指针(只读不可改)
const char *p = "123456";
- p 只存首地址,不拷贝数据
- 指向只读常量区
- 严禁修改内容(修改直接段错误)
- 必须加 const
八、终极对比表(秒杀所有选择题)
写法 | 性质 | 可否修改 | 是否合法字符串 |
|---|---|---|---|
'a' | 单个字符(1字节) | — | 否 |
"a" | 字符串常量(2字节) | 不可改 | 是 |
char arr[]="123456" | 栈字符数组 | 可改 | 是 |
char str[6]="123456" | 栈数组(无\0) | 可改 | 否(高危错误) |
const char *p="123456" | 常量字符串指针 | 不可改 | 是 |
九、完整可运行代码 + 标准运行结果
#include <stdio.h>
#include <string.h>
int main()
{
// 1. 单个字符
char c = 'a';
printf("字符演示:%c,ascii=%d\n\n", c, c);
// 2. 错误写法:丢失\0
char err_str[6] = "123456";
printf("错误写法 char[6]:sizeof=%d\n\n", sizeof(err_str));
// 3. 正确写法1:指定长度7
char str[7] = "123456";
printf("正确写法 char[7]:\n");
printf("sizeof=%d\n", sizeof(str));
printf("strlen=%d\n\n", strlen(str));
// 4. 正确写法2:自动推导(推荐)
char arr[] = "123456";
printf("正确写法 char[]:\n");
printf("sizeof=%d\n", sizeof(arr));
printf("strlen=%d\n\n", strlen(arr));
// 5. 常量字符串指针
const char *p = "123456";
printf("常量指针 strlen=%d\n", strlen(p));
return 0;
}运行结果
字符演示:a,ascii=97 错误写法 char[6]:sizeof=6 正确写法 char[7]: sizeof=7 strlen=6 正确写法 char[]: sizeof=7 strlen=6 常量指针 strlen=6
十、全篇终极口诀(直接背)
- 单引是字符,双引带零终;
- 字符串七字节,六字加一空;
- 数组少零必越界,指针常量不能动;
- 常量三态不退化,其余皆变指针用。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论