16. C语言 字符串详解

server/2025/1/15 12:40:03/

本章目录:

    • 前言
    • C 字符串的基础概念
      • 字符串的定义
      • 字符串的内存表示
    • 常见的字符串操作函数
      • 示例代码
    • 深入探讨字符串长度计算
      • `strlen` 与 `sizeof` 的区别
    • 字符串操作的注意事项
      • **1. 字符数组的大小**
      • 2. 字符数组和字符指针的区别
      • 3. 使用安全函数
    • 字符串的遍历与格式化输出
      • **遍历字符串**
      • 格式化输出
    • 总结


前言

在 C 语言中,字符串是一种特殊的数据类型,它实际上是以空字符 \0 结尾的一维字符数组。本文将从基本概念、常见函数使用、字符数组与字符指针的区别等多个角度深入探讨 C 语言字符串操作,帮助开发者更高效地掌握这一核心内容。


C 字符串的基础概念

字符串的定义

  • 字符串的本质:以空字符 \0 结束的字符数组。
  • 字符串字面量:例如 "hello world" 是常量,在编译时会自动添加 \0

###字符串初始化
C 提供了两种主要方式初始化字符串:

  1. 字符数组
    char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
    char site[] = "RUNOOB"; // 编译器自动添加 \0
    
  2. 字符指针
    char *greeting = "Hello";
    

注意:使用字符指针时,字符串内容存储在只读存储区,不能直接修改。

字符串的内存表示

字符串存储在内存中时,每个字符占据一个字节,末尾以 \0 标志结束。


常见的字符串操作函数

C 标准库 <string.h> 提供了一系列用于操作字符串的函数:

函数描述
strcpy(s1, s2)将字符串 s2 复制到 s1
strcat(s1, s2)将字符串 s2 连接到 s1 的末尾。
strlen(s1)返回字符串 s1 的长度(不包括 \0)。
strcmp(s1, s2)比较字符串 s1s2,返回值根据大小关系为 0、正值或负值。
strchr(s1, ch)返回指向字符串 s1 中字符 ch 第一次出现位置的指针。
strstr(s1, s2)返回指向字符串 s1 中子串 s2 第一次出现位置的指针。

示例代码

以下代码演示了这些函数的基本使用:

#include <stdio.h>
#include <string.h>int main() {char str1[20] = "Hello";char str2[] = "World";char str3[20];int len;// 复制字符串strcpy(str3, str1);printf("strcpy(str3, str1): %s\n", str3);// 连接字符串strcat(str1, str2);printf("strcat(str1, str2): %s\n", str1);// 计算字符串长度len = strlen(str1);printf("strlen(str1): %d\n", len);return 0;
}

输出结果

strcpy(str3, str1): Hello
strcat(str1, str2): HelloWorld
strlen(str1): 10

深入探讨字符串长度计算

strlensizeof 的区别

功能strlensizeof
计算内容字符串的实际长度(不包括 \0)。字符数组的大小(包括 \0)。
作用范围仅适用于字符串。可用于任何类型的变量和数据结构。
计算方式遍历字符串,遇到 \0 时停止计数。在编译时直接得出分配的内存大小。

示例

#include <stdio.h>
#include <string.h>void demo() {char s[] = "hello, world!";printf("sizeof(s): %lu\n", sizeof(s)); // 包括 '\0'printf("strlen(s): %lu\n", strlen(s)); // 不包括 '\0'
}int main() {demo();return 0;
}

输出

sizeof(s): 14
strlen(s): 13

字符串操作的注意事项

1. 字符数组的大小

在明确指定字符数组大小时,请务必为 \0 预留空间:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

如果未包含 \0

char greeting[5] = {'H', 'e', 'l', 'l', 'o'};
printf("%s\n", greeting); // 可能导致未定义行为

2. 字符数组和字符指针的区别

  • 字符数组:可修改内容;声明后占用固定内存。
  • 字符指针:内容存储在只读存储区,尝试修改会导致运行错误。

3. 使用安全函数

在 MSVC 编译器中,推荐使用安全函数 strcpy_sstrcat_s,这些函数多了一个缓冲区大小参数,可以避免缓冲区溢出问题:

#include <stdio.h>
#include <string.h>int main() {char dest[50];strcpy_s(dest, sizeof(dest), "Hello");strcat_s(dest, sizeof(dest), ", Secure World!");printf("%s\n", dest);return 0;
}

字符串的遍历与格式化输出

遍历字符串

char str[] = "Hello";
for (int i = 0; str[i] != '\0'; i++) {printf("%c ", str[i]);
}

格式化输出

  • %s 用于输出字符串:
    printf("Greeting: %s\n", str);
    

总结

  • 字符串的本质是以 \0 结束的字符数组。
  • 熟练掌握字符串操作函数,如 strcpystrcatstrlen
  • 注意 strlensizeof 的区别。
  • 使用安全函数(如 strcpy_s)确保代码的安全性。

通过灵活运用 C 语言中的字符串操作,开发者可以高效地处理文本数据,提高代码的健壮性和安全性。



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

相关文章

LabVIEW水位监控系统

LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法&#xff0c;为工业液体存储提供精确的水位调控&#xff0c;保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中&#xff0c;水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…

初识C++(二)

六、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 通俗地讲&#xff0c;可以理解为一个人能够拥有多个称呼&#xff0c;这些所有的称呼都是表示这一…

基于单片机的智能花卉浇水系统的设计与实现

摘要&#xff1a; 随着人们生活水平的不断提高&#xff0c;生活节奏也越来越快。人们经常忽视办公室或者家居的花卉&#xff0c;忘记浇水。本文设计了一种基于单片机的智能浇水系统。目的是解决养殖花卉的人忘记浇水的问题。本系统以单片机AT89S52为控制芯片&#xff0c;能够按…

Jmeter命令行生成html图形化报告失败反而生成temp文件问题解决

Jmeter生成html报告命令&#xff1a; jmeter -n -t 脚本文件名 -l 日志文件名 -e -o 目录名 出现这一问题的原因有二&#xff1a; JDK版本不对&#xff0c;我原先使用JDK17&#xff0c;后来使用JDK1.8版本就解决了打开 jmeter.properties 文件&#xff08;在Jmeter根目录的bi…

【Go】Go并发编程基础详解

1. 操作系统发展历程 1.1 进程概念 进程是程序的一次运行过程&#xff0c;进程这个概念是比较抽象的&#xff0c;从来就没有标准统一的定义&#xff0c;进程主要包含三部分要素&#xff1a;程序、数据、进程控制块 程序&#xff1a;用于描述进程要完成的功能&#xff0c;是控…

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

《自动驾驶与机器人中的SLAM技术》ch8:基于 IESKF 的紧耦合 LIO 系统

目录 基于 IESKF 的紧耦合 LIO 系统 1 IESKF 的状态变量和运动过程 1.1 对名义状态变量的预测 1.2 对误差状态变量的预测及对协方差矩阵的递推 2 观测方程中的迭代过程 3 高维观测中的等效处理 4 NDT 和 卡尔曼滤波的联系 5 紧耦合 LIO 系统的主要流程 5.1 IMU 静止初始化 …

【高阶数据结构】线段树加乘(维护序列)详细解释乘与加懒标记

文章目录 1.题目[AHOI2009] 维护序列 2.懒标记处理先加后乘的形式1. 先加后乘的操作 先乘后加的形式2. 先乘后加的操作**乘法操作****加法操作** 懒标记的下传 3.代码 1.题目 题目来源:https://www.luogu.com.cn/problem/P2023 [AHOI2009] 维护序列 题目背景 老师交给小可可…