`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` 函数中进行了测试。