gpt4 book ai didi

连接 3 个字符串并返回指向新字符串 C 的指针

转载 作者:太空狗 更新时间:2023-10-29 16:59:05 24 4
gpt4 key购买 nike

我想知道是否有人可以帮助我,我正在尝试连接 3 个字符串并返回指向新字符串的指针。我似乎无法弄清楚如何使用 strncat 而不是 strcatstrncpy 而不是 strcpy .我只学习 C,所以任何帮助将不胜感激。

char *concatenate(char *a, char *b, char *d) {
char str[80];
strcpy(str, a);
strcat(str, b);
strcat(str, d);
puts(str);
return (NULL);
}

最佳答案

您的方法不能用于返回连接的字符串:您将返回一个指向本地数组的指针,该数组在函数返回后不再有效,此外,您不检查缓冲区溢出。

这是一个分配内存的快速而肮脏的版本:

#include <stdlib.h>  
#include <string.h>

char *concatenate(const char *a, const char *b, const char *c) {
return strcat(strcat(strcpy(malloc(strlen(a) + strlen(b) + strlen(c) + 1,
a), b), c);
}

这是一个使用 memcpy 并测试 malloc 失败的更详细的版本:

#include <stdlib.h>  
#include <string.h>

char *concatenate(const char *a, const char *b, const char *c) {
size_t alen = strlen(a);
size_t blen = strlen(b);
size_t clen = strlen(c);
char *res = malloc(alen + blen + clen + 1);
if (res) {
memcpy(res, a, alen);
memcpy(res + alen, b, blen);
memcpy(res + alen + blen, c, clen + 1);
}
return res;
}

它应该更有效,因为它不执行额外的扫描 strcpystrcat 执行,但只有仔细的基准测试才能证明它是否是简单的真正改进以上版本。

如果您需要将 3 个字符串连接到现有缓冲区中,一个非常简单的解决方案是:

char dest[DEST_SIZE];

snprintf(dest, sizeof dest, "%s%s%s", a, b, c);

许多系统(linux、GNU、BSD)都定义了一个 asprintf() 函数来为结果字符串分配内存:

int asprintf(char **strp, const char *fmt, ...);

使用此函数,您可以非常简单地连接三个字符串:

#define _GNU_SOURCE
#include <stdio.h>

char *concatenate(const char *a, const char *b, const char *c) {
char *p;
return (asprintf(&p, "%s%s%s", a, b, c) >= 0) ? p : NULL;
}

关于连接 3 个字符串并返回指向新字符串 C 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34053859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com