gpt4 book ai didi

在 C 中连接字符串文字

转载 作者:行者123 更新时间:2023-11-30 21:19:25 25 4
gpt4 key购买 nike

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

int main() {
char *a = "3";
char *b = "2";
strcat(a, b);
printf("%s\n", a);
return 0;
}

运行此代码,出现段错误。我尝试了 strcpy(a,b) 但它也给出了相同的错误。

有什么方法可以将 a = "3"更改为 a = "32"吗?

最佳答案

这两个变量

char *a = "3";
char *b = "2";

指向字符串文字,并且您不能修改字符串文字,这会产生未定义的行为。在大多数情况下,字符串文字以只读方式存储内存,因此修改它们通常会以段错误结束。

如果要连接字符串,则需要为第二个字符串留出空间。

第一个解决方案:创建更大的数组:

char a[20] = "3";
char b[20] = "2";

strcat(a, b);
puts(a);

这将打印32

此解决方案的问题是,如果 b 太长,则无法容纳进入a,你将会溢出a。例如,如果您正在阅读用户输入的字符串可能比 a 可以容纳的长度长。在那里面应该使用 case strncat 或看看我的第二个解决方案。

第二种解决方案:动态分配内存

int main(void)
{
const char *a = "3";
const char *b = "2";

char *dest = malloc(strlen(a) + 1);

if(dest == NULL)
{
fprintf(stderr, "Not enough memory\n");
return 1;
}

strcpy(dest, a);

char *tmp = realloc(a, strlen(a) + strlen(b) + 1);
if(tmp == NULL)
{
fprintf(stderr, "Not enough memory\n");
free(dest);
return 1;
}

dest = tmp;

strcat(dest, b);

// printing concatenated string
puts(dest);

free(dest);

return 0;
}

另一种解决方案是

int main(void)
{
const char *a = "3";
const char *b = "2";

size_t len = strlen(a) + strlen(b);

// using calloc instead of malloc, because
// calloc sets the allocated memory to 0,
// great initialization for when using strcat
char *dest = calloc(len + 1, 1);

if(dest == NULL)
{
fprintf(stderr, "Not enough memory\n");
return 1;
}

strcat(dest, a);
strcat(dest, b);

// printing concatenated string
puts(dest);

free(dest);

return 0;
}

或者您也可以像这样使用snprintf:

int main(void)
{
const char *a = "3";
const char *b = "2";

int len = snprintf(NULL, 0, "%s%s", a, b);

char *dest = malloc(len + 1);

if(dest == NULL)
{
fprintf(stderr, "Not enough memory\n");
return 1;
}

sprintf(dest, "%s%s", a, b);

// printing concatenated string
puts(dest);

free(dest);

return 0;
}

此解决方案使用以下事实:当您传递 NULL 和 0 作为第一个时snprintf 的参数,该函数将返回该函数所包含的字符数需要生成的字符串,因此您可以使用该函数来确定连接字符串的总长度。当您想要时,此解决方案非常有用连接不同类型,例如连接字符串和数字。

一般来说,连接字符串的方法有很多种,看你选哪一种取决于您的需求:如何读取数据、您想用数据做什么连接,是否使用字符串文字等。

关于在 C 中连接字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com