重回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'
相关推荐
tkevinjd19 分钟前
C++中线程库的基本操作
开发语言·c++
CodeWithMe28 分钟前
【C/C++】不同防止头文件重复包含的措施
c语言·开发语言·c++
子豪-中国机器人42 分钟前
C++ 信息学奥赛总复习题答案解析
开发语言·c++·算法
oioihoii1 小时前
C++11列表初始化:从入门到精通
java·开发语言·c++
zdy12635746881 小时前
python第48天打卡
开发语言·python
whoarethenext1 小时前
使用 C++/OpenCV 创建动态流星雨特效 (实时动画)
开发语言·c++·opencv
whoarethenext1 小时前
使用 C/C++的OpenCV 实现模板匹配:从基础到优化
c语言·c++·opencv
Mr...Gan2 小时前
TypeScript
开发语言·javascript·typescript
合方圆~小文2 小时前
架空线路图像视频监测装置
c语言·c++·人工智能·嵌入式硬件·硬件工程·模拟退火算法
前端 贾公子2 小时前
《Vuejs设计与实现》第 8 章(挂载与更新)
开发语言·前端·javascript