用strcpy连接字符串

这是我的代码

#include  #include  #include  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”作为数组。 我想念的是什么

如果你坚持使用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字符串的更常规function。

编辑以下是使用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; } 

strcpy将字符串复制到目标的开头,您需要strcat

第二个strcpy覆盖前一个。 两者都将其内容复制到tmp指针(在它的开头)。 你应该使用tmp+strlen(f)

或者甚至更好地使用strcat

甚至更好地使用更安全的方法,如: strncpystrncat等。

您可能希望使用strcat而不是第二次strcpy调用,如下所示:

 strcpy(tmp, f); strcat(tmp, s); 

另请注意,为tmp分配strlen(f) + strlen(s) + 1个字节就足够了,不需要分配strlen(f) + strlen(s) + 2个字节。 连接后,您将只获得一个字符串,因此只需要一个空字符。

使用strcat()代替,这意味着附加一个包含在MSDN中的字符串doc.strcpy()只意味着复制一个字符串。 如果您不想使用strcat(),则应使用strncpy()或strcpy_s()指出位置。 请参阅文件。

问题是你复制第二个字符串代替第一个字符串( 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()来实现,尽管这会导致沿着复制的字符串进行额外的扫描。

以下是正确的惯用安全方式:

 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是否失败,如果要打印它们,分配内存和复制字符串是无用的和有害的 – 您可以执行以下操作:

 printf("%s%s", f, s);