首页 > 解决方案 > 通过将第二个字符串的字符一个接一个地复制到第一个字符串的末尾来合并两个字符串

问题描述

这个程序它应该打印 Hello World 但猜猜什么退出了,为什么会发生分段错误?

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

char f(char *a, char *b) 
{
    int i , m, n;
    m = strlen(a);
    n = strlen(b);
    for (i = 0; i<=n; i++)
    {
        a[m+i] = b[i];
    }
}

int main() {
char*str1 = "hello ";
char*str2 = "world!";
str1=f(str1, str2);
printf("%s", str1);
return 0;
}

标签: csegmentation-faultc-stringsstring-literalsfunction-definition

解决方案


不允许修改字符串文字。使用具有足够元素的数组代替要修改的字符串。

f同样分配to的返回值str1也是一个坏主意,因为return在函数中没有执行任何语句,f并且使用它的返回值会调用未定义的行为void如果您不打算返回任何内容,则应将返回类型更改为。

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

void f(char *a, char *b) 
{
    int i , m, n;
    m = strlen(a);
    n = strlen(b);
    for (i = 0; i<=n; i++)
    {
        a[m+i] = b[i];
    }
}

int main() {
    char str1[16] = "hello ";
    char*str2 = "world!";
    f(str1, str2);
    printf("%s", str1);
    return 0;
}

推荐阅读