C语言中字符与字符串的区别?

在 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',长度6
    char 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()等
可修改性可修改数组可修改,指针常量不可修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值