C语言快捷地复制字符串:strdup strndup

发布时间:2025-04-28      访问量:35
在C语言中,`strdup` 和 `strndup` 是用于复制字符串的函数,它们都定义在 `<string.h>` 头文件中。以下为你详细介绍这两个函数:

`strdup` 函数
- **功能**:`strdup` 函数用于复制一个字符串。它会为复制后的字符串分配足够的内存空间,并将原字符串的内容复制到新分配的内存中。
- **原型**:
char *strdup(const char *s);
- **参数**:`s` 是指向要复制的原字符串的指针。
- **返回值**:如果内存分配成功,返回指向新复制字符串的指针;如果内存分配失败,返回 `NULL`。
- **示例代码**:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { const char *original = "Hello, World!"; char *duplicate = strdup(original); if (duplicate != NULL) { printf("Original: %s\n", original); printf("Duplicate: %s\n", duplicate); free(duplicate); } return 0; }
- **代码解释**:在上述代码中,首先定义了一个原始字符串 `original`,然后使用 `strdup` 函数复制该字符串,将复制后的字符串存储在 `duplicate` 指针中。最后,打印原始字符串和复制后的字符串,并使用 `free` 函数释放 `duplicate` 所指向的内存。

`strndup` 函数
- **功能**:`strndup` 函数用于复制一个字符串的前 `n` 个字符。它会为复制后的字符串分配足够的内存空间,并将原字符串的前 `n` 个字符复制到新分配的内存中。如果原字符串的长度小于 `n`,则复制整个原字符串。
- **原型**:
c char *strndup(const char *s, size_t n);
- **参数**:
- `s` 是指向要复制的原字符串的指针。
- `n` 是要复制的字符数。
- **返回值**:如果内存分配成功,返回指向新复制字符串的指针;如果内存分配失败,返回 `NULL`。
- **示例代码**:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { const char *original = "Hello, World!"; size_t n = 5; char *duplicate = strndup(original, n); if (duplicate != NULL) { printf("Original: %s\n", original); printf("Duplicate: %s\n", duplicate); free(duplicate); } return 0; }
- **代码解释**:在上述代码中,首先定义了一个原始字符串 `original` 和要复制的字符数 `n`,然后使用 `strndup` 函数复制该字符串的前 `n` 个字符,将复制后的字符串存储在 `duplicate` 指针中。最后,打印原始字符串和复制后的字符串,并使用 `free` 函数释放 `duplicate` 所指向的内存。

注意事项
- 使用 `strdup` 和 `strndup` 函数分配的内存,在使用完毕后需要使用 `free` 函数释放,以避免内存泄漏。
- `strdup` 和 `strndup` 不是标准C库的一部分,但在许多Unix和类Unix系统中都有提供。如果在某些系统中没有这些函数,可以手动实现它们。

下面是手动实现 `strdup` 和 `strndup` 函数的示例代码:
c #include <stdio.h> #include <string.h> #include <stdlib.h> // 手动实现 strdup 函数 char *my_strdup(const char *s) { size_t len = strlen(s) + 1; char *dup = (char *)malloc(len); if (dup != NULL) { strcpy(dup, s); } return dup; } // 手动实现 strndup 函数 char *my_strndup(const char *s, size_t n) { size_t len = strlen(s); if (n < len) { len = n; } char *dup = (char *)malloc(len + 1); if (dup != NULL) { strncpy(dup, s, len); dup[len] = '\0'; } return dup; } int main() { const char *original = "Hello, World!"; char *dup1 = my_strdup(original); if (dup1 != NULL) { printf("strdup: %s\n", dup1); free(dup1); } char *dup2 = my_strndup(original, 5); if (dup2 != NULL) { printf("strndup: %s\n", dup2); free(dup2); } return 0; }
这段代码手动实现了 `strdup` 和 `strndup` 函数,并在 `main` 函数中进行了测试。
堆内存
多线程
strdup
初始化器
冒泡排序
增删改查
BufferedReader
输入输出
面向对象
生命周期
闭包的概念
原型链
Flask
mysql-connector-python
单例模式
浅拷贝
隔离级别
索引
InnoDB
左连接
聚合函数
PuTTY
TRUNCATE
str_starts_with_many
DateTime
array_combine
闭包的概念