我想知道是否有人可以帮助我,我试图连接3个字符串并返回指向新字符串的指针。我似乎无法弄清楚如何使用strncat而不是strcat和strncpy而不是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);
}
答案 0 :(得分:8)
你不能这样做,你会返回一个指向一个函数返回后不再有效的本地数组的指针,而且,你不会检查缓冲区溢出。
这是一个分配内存的快速脏版本:
#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;
}
它应该更高效,因为它不执行额外的扫描strcpy
和strcat
,但只有仔细的基准测试才能证明它是否是对上述简单版本的真正改进。
如果需要将3个字符串连接到现有缓冲区,一个非常简单的解决方案是:
char dest[DEST_SIZE];
snprintf(dest, sizeof dest, "%s%s%s", a, b, d);
答案 1 :(得分:5)
你的str是你职能的本地人 你可以在你的连接字符串中添加第四个参数,或者你可以在函数内进行malloc,只需确保在使用后释放它。
char *concatenate(char *a, char *b, char *c)
{
int size = strlen(a) + strlen(b) + strlen(c) + 1;
char *str = malloc(size);
strcpy (str, a);
strcat (str, b);
strcat (str, c);
return str;
}
int main(void) {
char *str = concatenate("bla", "ble", "bli");
printf("%s", str);
free(str);
return 0;
}
答案 2 :(得分:3)
也许是这样的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * concatenate(const char *a, const char *b, const char *d)
{
/* calculate the length of the new string */
size_t len = strlen(a) + strlen(b) + strlen(d);
/* allocate memory for the new string */
char* str = malloc(len + 1);
/* concatenate */
strcpy(str, a);
strcat(str, b);
strcat(str, d);
/* return the pointer to the new string
* NOTE: clients are responsible for releasing the allocated memory
*/
return str;
}
int main(void)
{
const char a[] = "lorem";
const char b[] = "impsum";
const char d[] = "dolor";
char* str = concatenate(a, b, d);
printf("%s\n", str);
free(str);
return 0;
}
答案 3 :(得分:3)
如果你想要更通用的东西(例如连接N个字符串),你可以在这里查看glib库的g_strconcat的实现: https://github.com/GNOME/glib/blob/master/glib/gstrfuncs.c#L563