C 标准库 - <string.h>详解

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: `<string.h>` 是 C 标准库中用于处理字符串的头文件,提供了复制、拼接、比较、查找等操作。常用函数包括 `strcpy`、`strncpy`、`strcat`、`strncat`、`strlen`、`strcmp`、`strncmp`、`strchr` 和 `strstr`。此外,还提供了辅助函数如 `memcpy` 和 `memset`。这些函数帮助开发者有效处理字符串,构建更强大的 C 程序。注意事项包括确保目标数组空间足够、正确处理 null 结束符,并使用安全版本函数减少风险。

<string.h> 是 C 标准库中用于处理字符串的头文件,提供了一系列函数来操作 C 风格的字符串(以 null 结尾的字符数组)。下面是 <string.h> 中一些常用函数的详细介绍。

1. 字符串操作函数

1.1 复制字符串

  • char *strcpy(char *dest, const char *src);

    将字符串 src 复制到 destdest 必须有足够的空间来存储 src

char dest[20];
strcpy(dest, "Hello, World!");

1.2 复制字符串(安全版本)

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

    src 的前 n 个字符复制到 dest,如果 src 长度小于 ndest 其余部分将填充为 \0

char dest[20];
strncpy(dest, "Hello", 5);

2. 拼接字符串

  • char *strcat(char *dest, const char *src);

    将字符串 src 拼接到 dest 的末尾。dest 必须有足够的空间来容纳结果字符串。

char dest[20] = "Hello, ";
strcat(dest, "World!");

2.1 拼接字符串(安全版本)

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

    src 的前 n 个字符拼接到 dest 的末尾。

char dest[20] = "Hello, ";
strncat(dest, "World!", 3);

3. 字符串长度

  • size_t strlen(const char *str);

    返回字符串 str 的长度(不包括结束符 \0)。

size_t len = strlen("Hello");

4. 字符串比较

  • int strcmp(const char *str1, const char *str2);

    字符串 str1str2 进行字典序比较,返回值:

    • 小于零:str1 小于 str2
    • 零:两者相等
    • 大于零:str1 大于 str2
if (strcmp("apple", "banana") < 0) {
   
    // "apple" 在字典序上小于 "banana"
}

4.1 字符串比较(安全版本)

  • int strncmp(const char *str1, const char *str2, size_t n);

    比较 str1str2 的前 n 个字符。

if (strncmp("Hello", "Hello, World!", 5) == 0) {
   
    // 前 5 个字符相等
}

5. 查找字符和字符串

  • char *strchr(const char *str, int c);

    返回指向字符串 str 中第一次出现字符 c 的指针,如果未找到则返回 NULL

char *p = strchr("Hello, World!", 'W');
  • char *strstr(const char *haystack, const char *needle);

    返回 haystack 中第一次出现 needle 的指针,如果未找到则返回 NULL

char *p = strstr("Hello, World!", "World");

6. 字符串转为整数

虽然不在 <string.h> 中,通常与字符串处理密切相关。可以使用 <stdlib.h> 中的 atoiatofstrtol 等函数将字符串转换为数值类型。

7. 其他辅助函数

  • void *memcpy(void *dest, const void *src, size_t n);

    src 复制 n 个字节到 dest

  • void *memset(void *str, int c, size_t n);

    str 中的前 n 个字符设置为 c

示例程序

下面是一个使用 <string.h> 的简单示例,展示了如何处理字符串:

#include <stdio.h>
#include <string.h>

int main() {
   
    char str1[20] = "Hello";
    char str2[20] = "World";
    char str3[40];

    // 字符串拼接
    strcpy(str3, str1);
    strcat(str3, ", ");
    strcat(str3, str2);
    printf("Concatenated string: %s\n", str3);

    // 字符串长度
    printf("Length of str3: %zu\n", strlen(str3));

    // 字符串比较
    if (strcmp(str1, str2) < 0) {
   
        printf("'%s' is less than '%s'\n", str1, str2);
    }

    // 查找字符
    char *p = strchr(str3, 'W');
    if (p != NULL) {
   
        printf("Found 'W' in str3: %s\n", p);
    }

    return 0;
}

注意事项

  1. 确保目标数组有足够的空间来存储复制或拼接后的字符串,以避免缓冲区溢出。
  2. C 字符串以 null 字符 (\0) 结束,始终确保在字符串操作时正确处理这个结束符。
  3. 使用安全版本的 strncpystrncat 等函数可以减少潜在的安全风险,特别是在处理不受信任的数据时。

通过了解和使用 <string.h> 中的函数,开发者可以有效地进行字符串处理,构建更强大的 C 程序。

相关文章
|
缓存 应用服务中间件 网络安全
Linux 配置 Nginx 服务完整详细版
Linux 配置 Nginx 服务完整详细版
1172 1
|
算法 Linux C++
【Linux系统编程】Linux目录操作:opendir、readdir与closedir详解
【Linux系统编程】Linux目录操作:opendir、readdir与closedir详解
951 0
|
Java 开发者
Java“类 Y 中的方法 X 不能应用于给定类型”解决
在Java中遇到“类Y中的方法X无法应用于给定类型”的错误时,通常是因为方法调用时的参数类型与定义不符。解决此问题需检查方法签名,确保传递的参数类型正确无误,或使用显式类型转换以匹配方法所需的参数类型。这种错误提示帮助开发者及时修正类型不匹配的问题。
919 1
|
12月前
|
数据采集 JavaScript 前端开发
浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现
本文介绍了如何构建一个反检测爬虫以爬取Amazon商品信息。通过使用`undetected-chromedriver`规避自动化检测,修改`navigator.webdriver`属性隐藏痕迹,并结合代理、Cookie和User-Agent技术,实现稳定的数据采集。代码包含浏览器配置、无痕设置、关键词搜索及数据提取等功能,同时提供常见问题解决方法,助你高效应对反爬策略。
1060 1
|
开发工具 Android开发 iOS开发
零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
OpenIM 为开发者提供开源即时通讯 SDK,作为 Twilio、Sendbird 等云服务的替代方案。借助 OpenIM,开发者可以构建安全可靠的即时通讯应用,如 WeChat、Zoom、Slack 等。 本仓库基于开源版 OpenIM SDK 开发,提供了一款基于 Flutter 的即时通讯应用。您可以使用此应用程序作为 OpenIM SDK 的参考实现。 开发环境 在开始开发之前,请确保您的系统已安装以下软件: 操作系统:macOS 14.6 或更高版本 Flutter:版本 3.24.5(根据官网步骤进行安装) Git:用于代码版本控制 同时,您需要确保已经部署了最
1076 10
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
1934 0
|
测试技术 开发工具 开发者
软件开发者的自我修养:从新手到专家的进阶之路
本文详细探讨了软件开发者从新手成长为专家所需的关键技能与心态。通过持续学习、注重代码可维护性、掌握版本控制、实施测试驱动开发、进行代码审查、提升沟通技巧、有效管理时间和勇敢面对失败等方面,全面分享了实用心得与建议。适合各阶段开发者阅读,助力职业生涯发展。
|
机器学习/深度学习 监控
在进行多任务学习时,确保模型不会过度拟合单一任务而忽视其他任务
多任务学习(MTL)中,为避免模型过度拟合单一任务,可采取任务权重平衡、损失函数设计、正则化、早停法、交叉验证、任务无关特征学习、模型架构选择、数据增强、任务特定组件、梯度归一化、模型集成、任务选择性训练、性能监控、超参数调整、多任务学习策略、领域适应性和模型解释性分析等策略,以提高模型泛化能力和整体表现。
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
1437 8
|
存储 固态存储 大数据
阿里云服务器收费价格表,云服务器实例、块存储、带宽等项目收费标准参考
阿里云服务器收费项目包括实例价格、预留实例券、专有宿主机、块存储价格、存储容量单位包、带宽价格和快照服务价格,收费模式既有包年包月也有按量付费模式,本文为大家汇总了这些项目的最新收费标准,以供参考。
1313 0
阿里云服务器收费价格表,云服务器实例、块存储、带宽等项目收费标准参考