重回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'
相关推荐
老胖闲聊2 分钟前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点22 分钟前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
乖乖是干饭王28 分钟前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
贩卖纯净水.32 分钟前
浏览器兼容-polyfill-本地服务-优化
开发语言·前端·javascript
weixin_4786897632 分钟前
C++ 对 C 的兼容性
java·c语言·c++
k要开心37 分钟前
C++概念以及基础框架语法
开发语言·c++
待什么青丝1 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
小柯博客1 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网
开发者工具分享1 小时前
如何应对敏捷转型中的团队阻力
开发语言
gregmankiw2 小时前
C#调用Rust动态链接库DLL的案例
开发语言·rust·c#