[英]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.