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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: `<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 程序。

相关文章
|
算法 安全 C语言
【剖析STL】String(一)
1.什么是STL? 标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。
54 0
|
2月前
|
编译器 C语言 C++
【C++】C++ STL 探索:String的使用与理解(三)
【C++】C++ STL 探索:String的使用与理解
|
2月前
|
编译器 C语言 C++
【C++】C++ STL 探索:String的使用与理解(一)
【C++】C++ STL 探索:String的使用与理解
102 1
|
2月前
|
存储 编译器 C++
【C++】C++ STL 探索:String的使用与理解(二)
【C++】C++ STL 探索:String的使用与理解
|
4月前
|
存储 算法 程序员
【STL】string
【STL】string
|
7月前
|
C++ 容器
【C++】标准库类型string
【C++】标准库类型string
193 3
|
7月前
|
存储 编译器 C++
C++:STL - string
C++:STL - string
81 1
|
7月前
|
存储 程序员 C++
C++ 标准库类型之string
C++ 标准库类型之string
65 0
|
算法 Linux C语言
【C++】从string开始了解STL(上)
【C++】从string开始了解STL(上)
|
编译器 C++ 容器
STL - string
STL - string
52 0