重回C语言之老兵重装上阵(九)字符串

C 语言字符串


在 C 编程语言中,字符串是由一系列字符组成的字符数组。字符串是以 空字符 \0 结尾的,以此标志字符串的结束。

1. 字符串的定义与表示

1.1 字符串定义

在 C 语言中,字符串是通过字符数组来定义的。定义字符串的一种常见方式是使用字符数组,数组的大小需要至少能容纳所有字符和一个结尾的空字符 \0

c 复制代码
char str[6] = "Hello"; // 包括 '\0' 结尾字符

在这个例子中,str 数组有 6 个元素,分别是 H, e, l, l, o, \0

1.2 字符串初始化

初始化字符串时,可以直接赋值:

c 复制代码
char str[] = "Hello";  // 自动分配 6 个字符大小

C 编译器会自动根据字符串内容计算数组的大小,因此 str 实际上是一个包含 6 个字符的数组:H, e, l, l, o, \0


2. 字符串的内存布局

C 字符串的内存中包括字符数组及结尾的空字符 \0。例如:

c 复制代码
char str[] = "C Program";

内存布局为:

C 空格 P r o g r a m \0
67 0 80 114 111 103 114 97 109 0

这里 C 的 ASCII 值是 67,P 是 80,以此类推,最后是空字符 \0,它表示字符串的结束。


3. 常见字符串操作函数

在 C 中,标准库提供了一些常见的字符串操作函数,主要包括 <string.h> 头文件中的函数。

3.1 strlen()

strlen() 用于计算字符串的长度(不包括 \0)。

c 复制代码
#include <string.h>

size_t len = strlen("Hello");  // 返回 5
3.2 strcpy()

strcpy() 用于将一个字符串拷贝到另一个字符串。

c 复制代码
#include <string.h>

char dest[10];
strcpy(dest, "World");  // 将 "World" 拷贝到 dest
3.3 strcat()

strcat() 用于将两个字符串连接起来。

c 复制代码
#include <string.h>

char str1[20] = "Hello";
char str2[] = " World!";
strcat(str1, str2);  // str1 变为 "Hello World!"
3.4 strcmp()

strcmp() 用于比较两个字符串,返回值分别为:

  • 0:字符串相同
  • 正数:第一个字符串大于第二个
  • 负数:第一个字符串小于第二个
c 复制代码
#include <string.h>

int result = strcmp("apple", "banana");  // 返回负值
3.5 strchr()

strchr() 用于查找字符在字符串中首次出现的位置。

c 复制代码
#include <string.h>

char *p = strchr("Hello", 'e');  // p 指向 'e'

4. 字符串与字符数组的区别

虽然字符串是以字符数组的形式存在的,但它与普通的字符数组还是有一些不同之处:

  • 空字符 \0 :字符串必须以空字符 \0 结尾,这意味着字符串在内存中会占用额外的一个字节。
  • 字符数组 :普通的字符数组没有 \0 限制,可以包含任意字符或数据。
c 复制代码
char str[] = "hello";  // 字符数组包含 5 个字符 + 1 个 '\0'
char arr[] = { 'h', 'e', 'l', 'l', 'o' };  // 不包含 '\0'

5. 动态分配字符串

C 语言中可以使用 malloc()calloc() 来动态分配内存以存储字符串。

c 复制代码
#include <stdlib.h>
#include <string.h>

char *str = (char *)malloc(20 * sizeof(char));  // 动态分配 20 个字符大小的内存
strcpy(str, "Hello, dynamic memory!");

在使用 malloc() 分配内存时,需要手动释放内存:

c 复制代码
free(str);  // 释放动态分配的内存

6. 字符串常见错误

6.1 字符串溢出

在 C 中,字符串的长度通常需要自己管理。若字符数组大小不足,可能导致字符串溢出。

c 复制代码
char str[5];
strcpy(str, "Hello");  // 溢出,会导致未定义行为
6.2 忘记结尾的 \0

字符串必须以 \0 结尾,若忘记加 \0,会导致字符串操作函数出错。

c 复制代码
char str[] = "Hello";  // 正确
char str[] = {'H', 'e', 'l', 'l', 'o'};  // 错误,缺少 '\0'
相关推荐
晨非辰1 小时前
#C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!
c语言·开发语言·经验分享·学习·visual studio
嫣语岁月3 小时前
【BMS电池管理】基于BQ76920与STM32的BMS设计开发
c语言·vscode·stm32·单片机·嵌入式硬件
励志码农3 小时前
JavaWeb 30 天入门:第二十三天 —— 监听器(Listener)
java·开发语言·spring boot·学习·servlet
天高云淡ylz3 小时前
子网掩码的隐形陷阱:为何能ping通却无法HTTPS访问
开发语言·php
希望20176 小时前
Golang Panic & Throw & Map/Channel 并发笔记
开发语言·golang
朗迹 - 张伟6 小时前
Golang安装笔记
开发语言·笔记·golang
yzx9910136 小时前
生活在数字世界:一份人人都能看懂的网络安全生存指南
运维·开发语言·网络·人工智能·自动化
小周同学@6 小时前
谈谈对this的理解
开发语言·前端·javascript
橙*^O^*安7 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
NiKo_W7 小时前
Linux 文件系统与基础指令
linux·开发语言·指令