重回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语言·数据结构·算法·新人首发
yaoxin5211231 天前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
NotFound4861 天前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
浅时光_c1 天前
14 结构体 共用体 枚举类型
c语言
Ava的硅谷新视界1 天前
用了一天 Claude Opus 4.7,聊几点真实感受
开发语言·后端·编程
rabbit_pro1 天前
Python调用onnx模型
开发语言·python
浪客川1 天前
【百例RUST - 010】字符串
开发语言·后端·rust
赵侃侃爱分享1 天前
学完Python第一次写程序写了这个简单的计算器
开发语言·python
断眉的派大星1 天前
# Python 魔术方法(魔法方法)超详细讲解
开发语言·python
2501_933329551 天前
技术深度拆解:Infoseek舆情处置系统的全链路架构与核心实现
开发语言·人工智能·自然语言处理·架构