如何在C中连接char *变量

时间:2018-02-02 06:03:08

标签: c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{    
    char *hi = "bye";
    char *bye = "abc";
    strcat(hi, bye);
    printf("%s\n", hi);


}

我如何连接这些变量?我尝试的所有东西都会崩溃

2 个答案:

答案 0 :(得分:2)

你做不到。字符串文字是不可修改的。

如果您从中复制出可修改的副本,则可以。这里使用字符串文字的内容初始化char数组。

char hi[10]="bye";
...

这会奏效。

在你的情况下,在字符串文字上使用strcat,你正在调用未定义的行为。

来自6.4.5p7

  

如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义

同样来自标准

J2: Undefined behavior列表
  

程序尝试修改字符串文字

请注意,即使字符串文字是可修改的,它也不是连接字符串的已定义行为。连接字符串时确保连接的字符串有足够的空间 - 否则它会尝试写入char数组,而char数组本身将调用未定义的行为。根据我在本段中所说的内容(使用字符串文字的值初始化的char数组),您可以亲眼看到一件事,

char hi[]="bye";

然后使用strcat会导致未定义的行为。

答案 1 :(得分:1)

字符串文字不可变。任何修改它的尝试都会调用未定义的行为

如果将目标字符串存储在数组中,您将能够修改它:

int main()
{    
    char hi[10] = "bye";
    char *bye = "abc";
    strcat(hi, bye);
    printf("%s\n", hi);
}

引用C标准草案N1570,第6.4.5 / 7节:

  

如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。

Why do I get a segmentation fault when writing to a string initialized with "char *s" but not "char s[]"?

了解详情