【发布时间】:2021-06-15 17:09:42
【问题描述】:
如何将strncat 与堆对象一起使用?
我正在尝试编写一个简单的函数来将 2 个字符串连接在一起返回结果,但是,如果不使返回缓冲区非常大(在其长度上增加大约 5000)以使其不会溢出,我就无法运行它。
我可能只是错误地使用了strncat 函数,使用堆对象而不是固定长度的字符数组。但我不知道我会怎么写。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *concatStrings(char *arg1, char *arg2) {
char *ret = malloc(strlen(arg1) + strlen(arg2));
strncpy(ret, arg1, strlen(arg1));
strncat(ret, arg2, strlen(arg2));
ret[strlen(arg1)+strlen(arg2)] = '\0';
return ret;
}
int main(int argc, char *argv[]) {
if (argc == 3) {
char *print = concatStrings(argv[1], argv[2]);
printf("\n%s", print);
free(print);
}
return 0;
}
【问题讨论】:
-
您必须
malloc(len+1)才能说明0-byte。为什么你在这里使用硬编码长度的strncpy和strncat? -
查看
snprintf(buf, sizeof buf, "%s%s", arg1, arg2);以(可能)替换您的strcpy(...); strcat(...); -
strncat和strlen作为参数是完全没有意义的。strncat通常是应该避免的危险函数之一,就像strncpy一样。 -
@SpeedrunnerG55:您不应该修复问题中的代码,因为它会使 cmets 和答案不一致。
-
将
strncpy与strlen(arg1)一起使用不仅没有意义。比那更糟。它不仅不提供任何额外的检查,而且主动省略了终止的 0 字节,因为它不包含在strlen中。结果不是有效的字符串,当您之后使用strncat时,您会导致未定义的行为。
标签: c concatenation c-strings function-definition