这是我的代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char f[] = "First";
char s[] = "Second";
char *tmp = malloc(strlen(f) + strlen(s) + 2);
strcpy(tmp, f);
strcpy(tmp, s);
printf("%s", tmp);
free(tmp);
return 0;
}
我正在尝试连接f和s。问题是tmp只包含“Second”作为数组。 我想念的是什么
答案 0 :(得分:6)
strcpy
将字符串复制到目标的开头,您需要strcat
。
答案 1 :(得分:3)
第二个strcpy
会覆盖前一个tmp+strlen(f)
。两者都将其内容复制到tmp指针(在它的开头)。您应该使用strcat
。
甚至更好地使用strncpy
。
甚至更好地使用更安全的方法,例如:strncat
,{{1}}等。
答案 2 :(得分:2)
如果您坚持使用strcpy
,则应略微修改您的代码:
int main() {
const char *f = "First";
const char *s = "Second";
char *tmp = malloc(strlen(f) + strlen(s) + 1);
strcpy(tmp, f);
strcpy(tmp+strlen(f), s);
printf("%s", tmp);
free(tmp);
return 0;
}
出于安全原因,您应该考虑使用strncpy
而不是strcpy
。此外,strcat
是用于连接C字符串的更常规函数。
编辑以下是使用strncpy
代替strcpy
#define MAX 1024
int main() {
const char *f = "First";
const char *s = "Second";
size_t len_f = min(strlen(f), MAX);
size_t len_s = min(strlen(s), MAX);
size_t len_total = len_f + len_s;
char *tmp = malloc(len_total + 1);
strncpy(tmp, f, len_f);
strncpy(tmp+len_f, s, len_s);
tmp[len_total] = '\0';
printf("%s", tmp);
free(tmp);
return 0;
}
答案 3 :(得分:1)
您可能希望使用strcat
而不是第二次strcpy
来电,如下所示:
strcpy(tmp, f);
strcat(tmp, s);
另请注意,为strlen(f) + strlen(s) + 1
分配tmp
个字节就足够了,不需要分配strlen(f) + strlen(s) + 2
个字节。连接后,您将只获得一个字符串,因此只需要一个空字符。
答案 4 :(得分:1)
使用strcat()代替,这意味着附加一个包含在MSDN中的字符串doc.strcpy()只意味着复制一个字符串。如果您不想使用strcat(),则应使用strncpy()或strcpy_s()指出位置。请参阅文档。
答案 5 :(得分:0)
问题是你复制第二个字符串代替第一个字符串(strcpy()
的第一个参数是复制字符串的位置),这有效地覆盖了第一个字符串。这里有一个你需要的想法:
size_t firstLen = strlen( f );
size_t secondLen = strlen( s );
char *tmp = malloc(firstLen + secondLen + 1);
strcpy(tmp, f);
strcpy(tmp + firstLen, s);
这可以通过使用strcat()
来实现,但这会导致沿复制的字符串进行额外扫描。
答案 6 :(得分:0)
以下是正确的惯用安全方式:
size_t l = strlen(f);
char *tmp = malloc(l + strlen(s) + 1);
strcpy(tmp, f);
strcpy(tmp+l, s);
或:
size_t l = strlen(f) + strlen(s) + 1;
char *tmp = malloc(l);
snprintf(tmp, l, "%s%s", f, s);
我倾向于选择后者,除非您编写嵌入式系统代码,以避免引入printf
依赖。
最后,请注意,您应该测试malloc
是否有失败,如果要打印它们,分配内存和复制字符串是无用的和有害的 - 您可以执行以下操作: / p>
printf("%s%s", f, s);