用strcpy连接字符串

时间:2012-01-11 14:54:48

标签: c

这是我的代码

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

7 个答案:

答案 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);