C语言duplicate是什么?如何解决?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

在C语言中,“duplicate”通常指复制重复数据,可能涉及字符串、数组、结构体或文件等场景,以下是常见场景的实现方法和注意事项:

c语言 duplicate
(图片来源网络,侵删)

字符串复制(strcpy vs strdup

方法1:使用 strcpy(需手动分配内存)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
    char src[] = "Hello, World!";
    char *dest = (char *)malloc(strlen(src) + 1); // 分配内存(+1用于'\0')
    if (dest == NULL) {
        perror("Memory allocation failed");
        return 1;
    }
    strcpy(dest, src); // 复制字符串
    printf("Copied: %s\n", dest);
    free(dest); // 释放内存
    return 0;
}

方法2:使用 strdup(自动分配内存)

#include <stdio.h>
#include <string.h>
int main() {
    char src[] = "Hello, World!";
    char *dest = strdup(src); // 自动分配内存并复制
    if (dest == NULL) {
        perror("strdup failed");
        return 1;
    }
    printf("Duplicated: %s\n", dest);
    free(dest); // 必须手动释放
    return 0;
}

注意strdup 是 POSIX 标准,Windows 下需用 _strdup


数组复制

一维数组

int src[] = {1, 2, 3, 4, 5};
int *dest = (int *)malloc(sizeof(src)); // 分配相同大小的内存
memcpy(dest, src, sizeof(src)); // 按字节复制

二维数组

int src[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*dest)[3] = malloc(2 * sizeof(*dest)); // 分配行数
memcpy(dest, src, sizeof(src));

结构体复制

浅拷贝(直接赋值)

struct Point {
    int x, y;
};
int main() {
    struct Point p1 = {10, 20};
    struct Point p2 = p1; // 直接复制
    printf("p2: (%d, %d)\n", p2.x, p2.y);
    return 0;
}

深拷贝(手动复制动态成员)

struct Person {
    char *name;
    int age;
};
int main() {
    struct Person p1;
    p1.name = strdup("Alice"); // 动态分配内存
    p1.age = 30;
    struct Person p2;
    p2.name = strdup(p1.name); // 复制字符串
    p2.age = p1.age;
    free(p1.name);
    free(p2.name);
    return 0;
}

文件复制

#include <stdio.h>
int main() {
    FILE *src = fopen("source.txt", "rb");
    FILE *dest = fopen("dest.txt", "wb");
    if (!src || !dest) {
        perror("File open failed");
        return 1;
    }
    char buffer[4096];
    size_t bytes;
    while ((bytes = fread(buffer, 1, sizeof(buffer), src)) > 0) {
        fwrite(buffer, 1, bytes, dest);
    }
    fclose(src);
    fclose(dest);
    return 0;
}

检测重复数据

字符串数组去重

#include <stdio.h>
#include <string.h>
int main() {
    char *arr[] = {"apple", "banana", "apple", "orange", "banana"};
    int n = 5;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (strcmp(arr[i], arr[j]) == 0) {
                printf("Duplicate found: %s\n", arr[i]);
                break;
            }
        }
    }
    return 0;
}

关键注意事项

  1. 内存管理
    • 使用 malloc/strdup 后必须 free,避免内存泄漏。
    • 确保目标缓冲区足够大(如 strcpy 需预留 '\0' 空间)。
  2. 深拷贝 vs 浅拷贝
    • 浅拷贝仅复制指针,可能导致双重释放或悬挂指针。
    • 深拷贝复制实际数据,适用于动态分配的结构体。
  3. 安全性
    • 避免使用 gets 等不安全的函数,改用 fgets
    • 检查 malloc 返回值是否为 NULL

根据具体场景选择合适的复制方法,并始终注意内存安全!

c语言 duplicate
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
CodeBlocks如何编写运行C语言程序?
« 上一篇 今天
C语言如何集成SQLcipher实现数据库加密?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]