第六章——字符型数据 第五节——字符串常量的定义及其与字符型常量的区别

第六章——字符型数据 第五节——字符串常量的定义及其与字符型常量的区别

亓翎_Re-Tikara Lv5

一、字符串常量的定义

1.1 基本概念

字符串常量是用双引号括起来的一串字符,系统会自动在字符串末尾添加结束符 '\0',作为字符串的终止标志。例如:

1
"Hello World"  "123"  "C"  ""  // 合法字符串常量  

核心规则

  • 结束符:字符串常量的存储包含 '\0'(占1字节),实际占用内存大小为字符数加1 。
  • 空字符串"" 是合法的字符串常量,仅包含 '\0',占用1字节内存 。

1.2 真题实战:内存占用计算

题目

1
2
3
4
char a[7] = "a0\0a0\0";  
int i = sizeof(a);
int j = strlen(a);
printf("%d %d", i, j);

答案7 2
解析

  • sizeof(a) 返回数组总大小(7字节),包含所有字符和 '\0'
  • strlen(a) 遇到第一个 '\0' 终止,仅计算前2个字符 。

二、字符串常量 vs 字符型常量

2.1 核心区别对比

特性 字符型常量 字符串常量
引号类型 单引号 ' ' 双引号 " "
内容容量 仅限单字符 可含多字符及 '\0' 结束符
内存占用 1 字节 字符数 + 1 字节('\0'
存储方式 直接存储 ASCII 码值 存储字符序列及结束符 '\0'

2.2 常见错误与修复

错误类型 错误示例 修复方法
混淆单双引号 char ch = "A"; 改为单引号:char ch = 'A';
多字符赋值给 char char ch = 'ab'; 改用字符数组:char str[] = "ab";
忽略 '\0' 的影响 char str[3] = "abc"; 扩大数组长度:char str[4] = "abc";

三、字符串处理函数的应用

3.1 常用函数及功能

  • strlen:计算字符串实际长度(不包含 '\0')。

    1
    2
    char str[] = "Hello";  
    printf("%d", strlen(str)); // 输出 5
  • strcpy:拷贝字符串(自动包含 '\0')。

    1
    2
    char dest[10], src[] = "C++";  
    strcpy(dest, src); // dest 内容为 "C++\0"
  • strcat:拼接字符串(覆盖目标字符串的 '\0')。

    1
    2
    char dest[20] = "Turbo";  
    strcat(dest, " C++"); // dest 内容为 "Turbo C++\0"

3.2 真题解析:字符串比较与赋值

题目

1
2
3
char *s1 = "OK", *s2 = "ok";  
if (strcmp(s1, s2) != 0)
puts(s1);

输出OK
解析strcmp 按 ASCII 码逐个比较字符,区分大小写,"OK""ok" 不同 。


四、调试与实践技巧

4.1 使用 sizeofstrlen 的陷阱

  • sizeof:返回数组总大小(包含 '\0')。
  • strlen:遇到 '\0' 终止,仅计算有效字符数。
1
2
3
char str[] = "\t\v\\\0will\n";  
printf("Sizeof: %d, Strlen: %d", sizeof(str), strlen(str));
// 输出:Sizeof: 9, Strlen: 3

4.2 输入输出函数的选择

  • scanf + %s:读取不含空格的字符串。
  • gets:可读取含空格的整行输入(需注意缓冲区溢出风险)。
  • puts:输出字符串并自动换行。
1
2
3
4
char str[80];  
printf("Input a string: ");
gets(str); // 输入 "How are you?"
puts(str); // 输出 "How are you?" 并换行

五、总结:字符串常量的核心法则

  1. 双引号包裹:字符串常量必须用双引号,末尾自动添加 '\0'
  2. 内存分配:字符数组大小需至少为字符串长度加1(含 '\0')。
  3. 函数依赖:字符串操作依赖库函数(如 strlen, strcpy),不能直接赋值或比较 。

🎯 记忆口诀
双引号串单引号符,字符串尾藏 \0;字符数组存文本,库函操作避错误!


后记

  C语言中没有专门存放字符串的字符串变量,字符串如果要放在变量中,必须用字符数组(char[])来存储。为了方便区分字符串常量和字符数组,有如下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <string.h>

int main() {
// ===== 字符串常量示例 =====
// 字符串常量:存储在只读内存中的固定字符串
// 以下两种写法等效
char *strConst1 = "Hello"; // 不可修改内容,指向只读内存的指针
const char strConst2[] = "World"; // 数组形式的常量字符串(内容不可修改)

// 尝试修改字符串常量会导致未定义行为
// strConst1[0] = 'h'; // 不建议取消注释此行

// ===== 字符数组示例 =====
// 可变的字符串存储方式
char strArray1[20] = "Hello"; // 明确指定大小
char strArray2[] = "World"; // 自动计算大小

// 修改字符数组内容是合法的
strArray1[0] = 'h'; // 合法操作
strArray2[0] = 'w';

// 输出结果
printf("字符串常量示例:\n");
printf("strConst1: %s\n", strConst1);
printf("strConst2: %s\n\n", strConst2);

printf("字符数组示例:\n");
printf("修改后 strArray1: %s\n", strArray1);
printf("修改后 strArray2: %s\n", strArray2);

// ===== 常见操作对比 =====
// 字符串拼接:目标必须是可修改的字符数组
char dest[50] = "Hello";
strcat(dest, " World"); // 合法
// strcat(strConst1, "!"); // 非法 - 不要取消注释

// 字符串复制
char dest2[50];
strcpy(dest2, strConst1); // 合法

return 0;
}
  • 标题: 第六章——字符型数据 第五节——字符串常量的定义及其与字符型常量的区别
  • 作者: 亓翎_Re-Tikara
  • 创建于 : 2026-02-07 02:21:28
  • 更新于 : 2026-02-10 02:48:46
  • 链接: https://re-tikara.fun/Blog/posts/df98f5f9/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。