繁体   English   中英

C - 用指针连接字符串

[英]C - string concatenation with pointers

为什么以下字符串连接不起作用?

main()
{
char *str1 = "United";
char *str2= "Front";
char *str3;
str3 = strcat(str1, str2 ) ;
printf("\n%s",str3 );

}

我在一本关于指针的书中的练习题中遇到了这个问题。 问题提到

[Q] 代码是否正确(如果不正确),并更正代码。

请参阅我对c 中字符数组的串联问题的回答

您不能更改字符串文字。

这个说法

str3 = strcat(str1, str2 ) ;

尝试更改字符串文字str1并且尝试写入超出字符串文字的内容。

要制作连接字符串,您必须分配足够大的内存以包含两个字符串。

您需要的是以下内容

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

int main(void) 
{
    const char *str1 = "United";
    const char *str2 = "Front";

    char *str3 = malloc( strlen( str1 ) + strlen( str2 ) + 1 );

    strcpy( str3, str1 );
    puts( strcat( str3, str2 ) );

    free( str3 );

    return 0;
}

程序输出是

UnitedFront

当您编写char* s = "something" ,会分配一块只读内存。 更多关于这里

strcat的声明如下所示:

char *strcat( char *dest, const char *src );

基本上它会做的是将src附加到dest ,但是由于您的目的地, str1没有足够的内存来保存两个字符串。

所以我要做的是,使用带有预分配缓冲区的snprintf或:

char *str1 = "United";
char *str2 = "Front";

char *buf = calloc(strlen(str1) + strlen(str2) + 1, sizeof(char));

strncpy(buf, str1, strlen(str1));
strncat(buf, str2, strlen(str2));

printf("%s", buf);

或使用snprintf

char *str1 = "United";
char *str2 = "Front";

int buf_len = strlen(str1) + strlen(str2) + 1;
char *buf = calloc(buf_len, sizeof(char));

snprintf(buf, buf_len, "%s%s", str1, str2);

strcat的第一个参数(在你的例子中是str1 )需要有足够的分配内存来保存连接的字符串。 您可以使用malloc创建它,也可以将其声明为一个足够大的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM