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

简介: `<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 程序。

相关文章
|
5月前
|
人工智能 自然语言处理 IDE
阿里云百炼Token Plan支持哪些AI编程工具?OpenClaw、Hermes Agent 全收录
阿里云百炼Token Plan支持OpenClaw、Hermes Agent、Qwen Code、Claude Code、OpenCode、Codex、Kilo CLI/Code等主流AI编程与Agent工具,兼容OpenAI/Anthropic协议,仅限交互式开发场景使用。在阿里云百炼平台:https://t.aliyun.com/U/fPVHqY 申请开通订阅Token Plan
2025最后一次S级大促,12月1688采购节报名指南!
1222采购节作为1688平台2025年最后一场S级大促,汇聚产业带优质货源,助力商家冲刺年终业绩。活动期间(12月22日-24日),跨店每满200减20,报名商品有机会入选“百亿补贴”获流量加持。商家需注意价格不超市场9.9折,建议优化运费提升竞争力。把握年底商机,积极备战,共赢收官之战!
|
Java 开发者
Java“类 Y 中的方法 X 不能应用于给定类型”解决
在Java中遇到“类Y中的方法X无法应用于给定类型”的错误时,通常是因为方法调用时的参数类型与定义不符。解决此问题需检查方法签名,确保传递的参数类型正确无误,或使用显式类型转换以匹配方法所需的参数类型。这种错误提示帮助开发者及时修正类型不匹配的问题。
1248 1
|
机器学习/深度学习 存储 人工智能
智能语音识别技术的深度剖析与应用前景####
本文深入探讨了智能语音识别技术的技术原理、关键技术突破及广泛应用场景,通过具体实例展现了该技术如何深刻改变我们的日常生活和工作方式。文章还分析了当前面临的挑战与未来发展趋势,为读者提供了一幅全面而深入的智能语音识别技术图景。 ####
|
C语言
数据结构基础详解(C语言):图的基本概念_无向图_有向图_子图_生成树_生成森林_完全图
本文介绍了图的基本概念,包括图的定义、无向图与有向图、简单图与多重图等,并解释了顶点度、路径、连通性等相关术语。此外还讨论了子图、生成树、带权图及几种特殊形态的图,如完全图和树等。通过这些概念,读者可以更好地理解图论的基础知识。
1693 8
|
开发者
C 标准库 - <stdio.h>详解
`&lt;stdio.h&gt;` 是 C 标准库中用于处理输入和输出(I/O)的头文件,提供了多种功能,如格式化输入输出、文件操作等。
1802 1
|
C#
c#中switch case语句的用法
C#中的 `switch case`语句提供了一种简洁而高效的方式来处理多个条件分支。通过了解其基本语法、注意事项和高级用法,可以在实际开发中灵活运用 `switch case`,提高代码的可读性和维护性。希望本文能帮助你更好地理解和使用C#中的 `switch case`语句。
1563 0
|
程序员 开发工具 git
腾讯自研Git客户端,助力每个人都可以轻松使用Git
腾讯自研Git客户端,助力每个人都可以轻松使用Git
731 0
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
356 1
【Vue3+TypeScript】CRM系统项目搭建之 — 状态管理
【Vue3+TypeScript】CRM系统项目搭建之 — 状态管理
246 0