当前位置: 首页 > news >正文

16. C语言 字符串详解

本章目录:

    • 前言
    • 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.lryc.cn/news/520882.html

相关文章:

  • 使用Buildroot开始嵌入式Linux系统之旅-3
  • [免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】
  • 【已解决】【记录】2AI大模型web UI使用tips 本地
  • 44.ComboBox的数据绑定 C#例子 WPF例子
  • 物联网之传感器技术
  • QTreeWidget QTreeWidgetItem
  • torch.einsum计算张量的外积
  • PostgreSQL 超级管理员详解
  • RabbitMQ 工作模式使用案例之(发布订阅模式、路由模式、通配符模式)
  • 【2024年华为OD机试】(C卷,100分)- 机场航班调度程序 (Java JS PythonC/C++)
  • Vue.js组件开发-使用地图绘制轨迹
  • vue 与 vue-json-viewer 实现 JSON 数据可视化
  • ubuntu Android : adb logcat 过滤多个log
  • kubeneters-循序渐进Cilium网络(三)
  • 编译与汇编
  • 对MySQL滴MVCC理解(超详细)
  • Mac玩Steam游戏秘籍!
  • matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题
  • 电商项目-基于ElasticSearch实现商品搜索功能(三)
  • 【Vim Masterclass 笔记12】S06L26 + L27:Vim 文本的搜索、查找及替换同步练习(含点评课)
  • Jsoup实现实时爬取
  • 如何在Ubuntu上安装Cmake
  • 图解Git——分支开发工作流《Pro Git》
  • 没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放
  • 回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测
  • 开发人员学习书籍推荐(C#、Python方向)
  • Springboot + vue 小区物业管理系统
  • 基于深度学习的视觉检测小项目(十二) 使用线条边框和渐变颜色美化界面
  • 基于OQuPy的量子编程实例探究:理论、实践与展望
  • 【数据库】二、关系数据库