在 C 语言中,字符(Character)和字符串(String)是两个不同的概念,它们在定义、存储、操作等方面都存在明显的区别,下面为你详细介绍:
定义与表示
字符
(1)字符是单个的字符数据,在 C 语言中用单引号 ’ ’ 来表示。字符类型使用 char 关键字来声明。
例如:
#include <stdio.h>int main()
{char ch = 'A'; //ch为字符变量,它它存储了字符 'A'printf("字符: %c\n", ch);return 0;
}
(2)占用1字节内存。用于存储一个字符的 ASCII 码值。
例如,字符 ‘A’ 的 ASCII 码值是 65,在内存中就存储这个整数值。
字符串
(1)字符串是由零个或多个字符组成的序列,以空字符’\0’(ASCII值为0)结尾。
(2)用双引号" " 包裹,例如:char str[] = “Hello”;
(3)存储时需额外1字节存放’\0’。例如,"Hello"占用6字节(5字符 + 1终止符)。
实际上字符串在 C 语言中是以字符数组的形式存储的
例如:
#include <stdio.h>int main()
{char str[] = "Hello";printf("字符串: %s\n", str);return 0;
}
/*str 是一个字符数组,它存储了字符串 "Hello",该字符串在内存中实际存储为 'H'、'e'、'l'、'l'、'o'、'\0'。*/
存储方式
字符:
字符只占用一个字节的内存空间,用于存储一个字符的 ASCII 码值。
例如,字符 ‘A’ 的 ASCII 码值是 65,在内存中就存储这个整数值。
字符串:
(1)字符串存储在字符数组中,数组的每个元素存储一个字符,并且最后一个元素必须是 ‘\0’。因此,字符串所占用的内存空间等于字符串中字符的个数加 1。
(2)未正确添加’\0’的字符数组无法被当作字符串处理(可能导致越界访问)。
例如,字符串 “Hello” 有 5 个字符,加上结束符 ‘\0’,总共占用 6 个字节的内存空间。
赋值与初始化
字符:
字符变量可以直接用单引号括起来的字符进行赋值。
例如:
char ch;
ch = 'B';
操作函数:getchar(), putchar()等。
#include <stdio.h>int main()
{char ch;printf("请输入一个字符: ");ch = getchar();printf("你输入的字符是: %c\n", ch);return 0;
}
字符串:
字符串的赋值和初始化有多种方式。可以在定义数组时直接用双引号初始化,也可以使用 strcpy 等函数进行赋值。
例如:
#include <stdio.h>
#include <string.h>
int main()
{char str1[] = "World"; // 自动添加'\0',长度6char str2[10]; char str4[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 手动添加char *str5 = "Hello"; // 字符串常量(不可修改)strcpy(str2, str1);printf("str2: %s\n", str2);return 0;
}
操作函数:strlen(), strcpy(), strcmp()等,依赖’\0’判断结尾。
#include <stdio.h>
#include <string.h>int main()
{char str[] = "Hello";int len = strlen(str);printf("字符串的长度是: %d\n", len);return 0;
}
输入输出操作
字符:
输入字符可以使用 scanf 函数(格式控制符为 %c)或 getchar 函数;输出字符可以使用 printf 函数(格式控制符为 %c)或 putchar 函数。
字符串:
输入字符串可以使用 scanf 函数(格式控制符为 %s)、gets 函数(不推荐,存在缓冲区溢出风险)或 fgets 函数;输出字符串可以使用 printf 函数(格式控制符为 %s)或 puts 函数。
例如:
#include <stdio.h>int main()
{char str[20];printf("请输入一个字符串: ");fgets(str, sizeof(str), stdin);printf("你输入的字符串是: %s", str);return 0;
}
内存与指针
字符
存储在栈或寄存器中,直接通过变量名访问。
字符串
(1)若通过数组定义(如char str[]),内存分配在栈上,内容可修改。
(2)若通过指针定义(如char *str = “…”),指向常量区的只读内存,修改会导致未定义行为(如程序崩溃)。
(3)sizeof运算符对数组返回总字节数(含’\0’),对指针返回指针大小(通常4或8字节)。
示例对比
// 字符
char ch = 'A'; // 正确
char ch2 = 'AB'; // 错误:单引号内只能有一个字符// 字符串
char s1[] = "Hello"; // 正确,自动添加'\0'
char s2[5] = "Hello"; // 错误:长度不足(需至少6字节)
char s3[] = {'H', 'i'}; // 不是字符串(缺少'\0')
总结
特性 | 字符(char) | 字符串(char[]/char)* |
---|---|---|
表示 | 单引号(‘A’) | 双引号(“Hello”) |
内存占用 | 1字节 | 字符数 + 1(‘\0’) |
结尾标志 | 无 | 必须包含’\0’ |
操作函数 | getchar(), putchar() | strlen(), strcpy()等 |
可修改性 | 可修改 | 数组可修改,指针常量不可修改 |