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

server/2025/1/19 9:58:00/

C 语言字符串


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

1. 字符串的定义与表示

1.1 字符串定义

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

char str[6] = "Hello"; // 包括 '\0' 结尾字符

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

1.2 字符串初始化

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

char str[] = "Hello";  // 自动分配 6 个字符大小

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


2. 字符串的内存布局

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

char str[] = "C Program";

内存布局为:

C空格Program\0
67080114111103114971090

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


3. 常见字符串操作函数

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

3.1 strlen()

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

#include <string.h>size_t len = strlen("Hello");  // 返回 5
3.2 strcpy()

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

#include <string.h>char dest[10];
strcpy(dest, "World");  // 将 "World" 拷贝到 dest
3.3 strcat()

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

#include <string.h>char str1[20] = "Hello";
char str2[] = " World!";
strcat(str1, str2);  // str1 变为 "Hello World!"
3.4 strcmp()

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

  • 0:字符串相同
  • 正数:第一个字符串大于第二个
  • 负数:第一个字符串小于第二个
#include <string.h>int result = strcmp("apple", "banana");  // 返回负值
3.5 strchr()

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

#include <string.h>char *p = strchr("Hello", 'e');  // p 指向 'e'

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

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

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

5. 动态分配字符串

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

#include <stdlib.h>
#include <string.h>char *str = (char *)malloc(20 * sizeof(char));  // 动态分配 20 个字符大小的内存
strcpy(str, "Hello, dynamic memory!");

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

free(str);  // 释放动态分配的内存

6. 字符串常见错误

6.1 字符串溢出

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

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

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

char str[] = "Hello";  // 正确
char str[] = {'H', 'e', 'l', 'l', 'o'};  // 错误,缺少 '\0'

http://www.ppmy.cn/server/159596.html

相关文章

自动化仓储管理与库存控制

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 本文是一本关于仓储管理与库存控制的教材&#xff0c;全…

蓝桥杯历届真题 #食堂(C++,Java)

这题没什么好说的 考虑所有情况然后写就完了 虽然赛场上 交完不知道答案(doge) 原题链接 #include<iostream>using namespace std;int main() {int n;cin >> n;//能优先安排6人桌,要先安排6人桌//6人桌可以是222 或者 33 或者42//优先用33组合,因为3人寝只能凑6人…

Windows 上安装 MongoDB 的 zip 包

博主介绍&#xff1a; 大家好&#xff0c;我是想成为Super的Yuperman&#xff0c;互联网宇宙厂经验&#xff0c;17年医疗健康行业的码拉松奔跑者&#xff0c;曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 近期专注&#xff1a; RPA应用研究&#xff0c;主流厂商产…

高等数学学习笔记 ☞ 定积分的定义与性质

1. 定积分的定义 设函数在闭区间上有界。在闭区间上任意插入若干个分点&#xff0c;即&#xff0c; 此时每个小区间的长度记作(不一定是等分的)。然后在每个小区间上任意取&#xff0c;对应的函数值为。 为保证每段的值(即矩形面积)无限接近于函数与该区间段所围成的面积&…

新星杯-ESP32智能硬件开发--ESP32系统

本博文内容导读&#x1f4d5;&#x1f389;&#x1f525; 1、ESP32芯片和系统架构进行描述&#xff0c;给出ESP32系统的地址映射规则。 2、介绍ESP32复位及时钟定时具体功能&#xff0c;方便后续开发。 3、介绍基于ESP32开发板使用的底层操作系统&#xff0c;对ESP32应用程序开…

设计模式-结构型-装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;是结构型设计模式中的一种&#xff0c;它允许你通过将对象封装在一个新的对象中&#xff0c;来动态地添加新的功能&#xff0c;而无需改变原对象的结构。装饰器模式的核心思想是“将功能附加到对象上”&#xff0c;它是一种…

开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)

一、前言 代码专家模型是基于人工智能的先进技术&#xff0c;它能够自动分析和理解大量的代码库&#xff0c;并从中学习常见的编码模式和最佳实践。这种模型可以提供准确而高效的代码建议&#xff0c;帮助开发人员在编写代码时避免常见的错误和陷阱。 通过学习代码专家模型&a…

[BrainShadow-V1] VR头戴设备统计报告

Brain-Shadow-V1 EventVR headsetsReported byXiao enDate2025/01/15Version1.0 HTC Vive Pro 2 Pro HTC Vive Pro 2 是一款高端虚拟现实头显&#xff0c;配备双 2.5K 显示屏&#xff0c;组合分辨率达到 48962448&#xff0c;提供 120 的视场角和 120Hz 的刷新率。该设备支持…