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

C标准库函数:字符串操作

目录

(一)C标准库函数:#include

一、char *strcpy(char *dest, const char *src);

二、char *strncpy(char *dest, const char *src, size_t n);

三、char *strcat(char *dest, const char *src);

四、char *strncat(char *dest, const char *src, size_t n);

(二)自定义字符串处理函数

一、自定义 strcpy函数

二、自定义 `strlen` 函数


在C语言中,字符串是以空字符 `'\0'` 结尾的字符数组。

  • C标准库<string.h>提供了一系列用于字符串操作的函数;
  • 同时我们也可以自定义字符串处理函数

下面将从标准库函数 `strcpy` 开始,详细介绍字符串操作,并给出自定义字符串处理函数的示例。

(一)C标准库函数:#include <string.h>

序号函数原型作用注意

1

char *strcpy(char *dest, const char *src);将一个字符串复制到另一个字符串中strcpy不会检查目标字符串的大小,如果源字符串的长度超过了目标字符串的容量,会导致缓冲区溢出,引发未定义行为。
2char *strncpy(char *dest, const char *src, size_t n);避免 `strcpy` 可能导致的缓冲区溢出问题如果源字符串的长度小于 `n`,`strncpy` 会在复制完源字符串后,继续用空字符填充目标字符串,直到达到 `n` 个字符。如果源字符串的长度大于等于 `n`,则不会自动添加字符串结束符 `'\0'`,需要手动添加。
3char *strcat(char *dest, const char *src);用于将一个字符串追加到另一个字符串的末尾`strcat` 同样不会检查目标字符串的大小,如果目标字符串的剩余空间不足以容纳源字符串,会导致缓冲区溢出。
4char *strncat(char *dest, const char *src, size_t n);避免 `strcat` 可能导致的缓冲区溢出问题strncat会自动在追加后的字符串末尾添加 `'\0'`,并且不会超过目标字符串的最大容量。

一、char *strcpy(char *dest, const char *src);

1. 作用:将一个字符串复制到另一个字符串中
2. 参数:
(1)dest:目标字符串的指针,用于存储复制后的字符串。
(2)src:源字符串的指针,要复制的字符串。
3. 返回值:返回目标字符串的指针 dest。
4. 库:#include <string.h>
5. 示例代码:

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, World!";char dest[20];strcpy(dest, src);printf("Copied string: %s\n", dest);return 0;
}

6. 注意事项:strcpy不会检查目标字符串的大小,如果源字符串的长度超过了目标字符串的容量,会导致缓冲区溢出,引发未定义行为。

二、char *strncpy(char *dest, const char *src, size_t n);

1. 作用:为了避免 `strcpy` 可能导致的缓冲区溢出问题
2. 参数:
(1)dest:目标字符串的指针。
(2)src:源字符串的指针。
(3)n:要复制的最大字符数。
3. 返回值:返回目标字符串的指针 dest。
4. 库:#include <string.h>
5. 示例代码:

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, World!";char dest[6];strncpy(dest, src, 5);dest[5] = '\0';  // 手动添加字符串结束符printf("Copied string: %s\n", dest);return 0;
}

6. 注意事项:如果源字符串的长度小于 `n`,`strncpy` 会在复制完源字符串后,继续用空字符填充目标字符串,直到达到 `n` 个字符。如果源字符串的长度大于等于 `n`,则不会自动添加字符串结束符 `'\0'`,需要手动添加。

三、char *strcat(char *dest, const char *src);

1. 作用:用于将一个字符串追加到另一个字符串的末尾
2. 参数:
(1)dest:目标字符串的指针,用于存储追加后的字符串。
(2)src:源字符串的指针,要追加的字符串。
3. 返回值:返回目标字符串的指针 dest。
4. 库:#include <string.h>
5. 示例代码:

#include <stdio.h>
#include <string.h>int main() {char dest[20] = "Hello, ";char src[] = "World!";strcat(dest, src);printf("Concatenated string: %s\n", dest);return 0;
}

6. 注意事项:strcat同样不会检查目标字符串的大小,如果目标字符串的剩余空间不足以容纳源字符串,会导致缓冲区溢出。
 

四、char *strncat(char *dest, const char *src, size_t n);

1. 作用:为了避免 `strcat` 可能导致的缓冲区溢出问题
2. 参数:
(1)dest:目标字符串的指针。
(2)src:源字符串的指针。
(3)n:要追加的最大字符数。
3. 返回值:返回目标字符串的指针 dest。
4. 库:#include <string.h>
5. 示例代码:

#include <stdio.h>
#include <string.h>int main() {char dest[20] = "Hello, ";char src[] = "World!";strncat(dest, src, 3);printf("Concatenated string: %s\n", dest);return 0;
}

6. 注意事项:strncat会自动在追加后的字符串末尾添加 `'\0'`,并且不会超过目标字符串的最大容量。

(二)自定义字符串处理函数

一、自定义 strcpy函数

#include <stdio.h>
// 自定义 strcpy 函数
char *my_strcpy(char *dest, const char *src) {char *original_dest = dest;while (*src != '\0') {*dest = *src;dest++;src++;}*dest = '\0';  // 添加字符串结束符return original_dest;
}int main() {char src[] = "Hello, World!";char dest[20];my_strcpy(dest, src);printf("Copied string: %s\n", dest);return 0;
}


二、自定义 `strlen` 函数

#include <stdio.h>
// 自定义 strlen 函数
size_t my_strlen(const char *str) {size_t len = 0;while (*str != '\0') {len++;str++;}return len;
}int main() {char str[] = "Hello, World!";size_t length = my_strlen(str);printf("Length of the string: %zu\n", length);return 0;
}

通过以上介绍,你可以了解到C语言中标准库提供的字符串操作函数以及如何自定义字符串处理函数。在实际使用中,要注意缓冲区溢出的问题,确保程序的安全性。

http://www.xdnf.cn/news/674263.html

相关文章:

  • 【深度学习】7. 深度卷积神经网络架构:从 ILSVRC、LeNet 到 AlexNet、ZFNet、VGGNet,含pytorch代码结构
  • NLP助力非结构化文本抽取:实体关系提取实战
  • 【ASR】基于分块非自回归模型的流式端到端语音识别
  • qt之开发大恒usb3.0相机二
  • Pytorch
  • 题目 3341: 蓝桥杯2025年第十六届省赛真题-抽奖
  • 颠覆传统,智领未来——UMI企业智脑:重新定义企业智能化转型的全新可能
  • 不同电脑同一个网络ip地址一样吗?如何更改
  • ODSA架构与操作-1
  • 【Elasticsearch】_update api的增量更新
  • 企业级RAG技术实战指南:从理论到落地的全景解析
  • .NET用C#设置Excel单元格和工作表的背景
  • AI大模型学习三十、ubuntu安装comfyui
  • vue3简介以及创建第一个vue3工程
  • 无人机仿真环境(3维)附项目git链接
  • 仓颉入门:特性
  • Elasticsearch的运维
  • ubuntu20.04安装CUDA、Cudnn
  • 深度学习————注意力机制模块
  • Milvus向量数据库DML操作实战教程
  • android平台驱动开发(四)--系统属性节点控制GPIO
  • 字节跳动BAGEL-7B-MoT模型开源:多模态AI技术的新范式与行业涟漪
  • Python爬虫实战:研究Playwright框架相关技术
  • SD07_NVM的安装及相关操作
  • 解码STREAM:GEO技术方法论全解析
  • 多空短线决策副图指标,通达信炒股软件指标操盘图文教程
  • 安卓学习笔记-声明式UI
  • 2025年5月蓝桥杯stema省赛真题——象棋移动
  • ViewModel
  • MySQL问题:主要索引类型(聚簇、辅助、覆盖、前缀)