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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: `<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 服务完整详细版
1162 1
|
算法 Linux C++
【Linux系统编程】Linux目录操作:opendir、readdir与closedir详解
【Linux系统编程】Linux目录操作:opendir、readdir与closedir详解
934 0
|
Java 开发者
Java“类 Y 中的方法 X 不能应用于给定类型”解决
在Java中遇到“类Y中的方法X无法应用于给定类型”的错误时,通常是因为方法调用时的参数类型与定义不符。解决此问题需检查方法签名,确保传递的参数类型正确无误,或使用显式类型转换以匹配方法所需的参数类型。这种错误提示帮助开发者及时修正类型不匹配的问题。
893 1
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
1848 0
|
测试技术 开发工具 开发者
软件开发者的自我修养:从新手到专家的进阶之路
本文详细探讨了软件开发者从新手成长为专家所需的关键技能与心态。通过持续学习、注重代码可维护性、掌握版本控制、实施测试驱动开发、进行代码审查、提升沟通技巧、有效管理时间和勇敢面对失败等方面,全面分享了实用心得与建议。适合各阶段开发者阅读,助力职业生涯发展。
|
机器学习/深度学习 监控
在进行多任务学习时,确保模型不会过度拟合单一任务而忽视其他任务
多任务学习(MTL)中,为避免模型过度拟合单一任务,可采取任务权重平衡、损失函数设计、正则化、早停法、交叉验证、任务无关特征学习、模型架构选择、数据增强、任务特定组件、梯度归一化、模型集成、任务选择性训练、性能监控、超参数调整、多任务学习策略、领域适应性和模型解释性分析等策略,以提高模型泛化能力和整体表现。
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
1397 8
|
存储 固态存储 大数据
阿里云服务器收费价格表,云服务器实例、块存储、带宽等项目收费标准参考
阿里云服务器收费项目包括实例价格、预留实例券、专有宿主机、块存储价格、存储容量单位包、带宽价格和快照服务价格,收费模式既有包年包月也有按量付费模式,本文为大家汇总了这些项目的最新收费标准,以供参考。
1292 0
阿里云服务器收费价格表,云服务器实例、块存储、带宽等项目收费标准参考
|
存储 C语言
C 标准库 - <stdlib.h>详解
`&lt;stdlib.h&gt;` 是 C 语言标准库中的头文件,提供了多种工具和函数,涵盖内存管理、进程控制、转换及随机数生成等功能。其中包括 `malloc`、`calloc` 和 `free` 等内存管理函数,`atoi` 和 `atof` 等转换函数,以及 `rand` 和 `srand` 等随机数生成函数。此外,还提供了 `exit` 和 `atexit` 等程序控制函数,以及 `getenv` 和 `system` 等环境控制函数。
2352 11
|
C#
c#中switch case语句的用法
C#中的 `switch case`语句提供了一种简洁而高效的方式来处理多个条件分支。通过了解其基本语法、注意事项和高级用法,可以在实际开发中灵活运用 `switch case`,提高代码的可读性和维护性。希望本文能帮助你更好地理解和使用C#中的 `switch case`语句。
1337 0