Warm tip: This article is reproduced from serverfault.com, please click

c-无法连接两个字符串并从函数返回它

(c - Unable to concatenate two strings and return it from a function)

发布于 2020-11-29 15:00:09

以下C代码给出了分段错误。

#include <stdio.h>
#include<string.h>
char *getSegment(char *symbol2,char *symbol3,char *filename) {
    if (strcmp(symbol2,"static") == 0) return strcat(filename,symbol3);
}

int main() {
    char *symbol2="static";
    char *symbol3="asdf";
    char *filename="zxcn";
    printf("%s\n",getSegment(symbol2,symbol3,filename));
    return 0;
}

我正在尝试串联两个字符串,并从函数返回串联的字符串。

Questioner
ANSHUL GUPTA
Viewed
0
Adrian Mole 2020-11-29 23:37:43

你的getSegment函数本身没有任何问题,除了以下事实:如果比较正确,则该函数不会返回有效的字符串相反,你给它提供了无效的第三个参数(目标字符串)。

filename变量是一个指向长度为5个字符常量字符串文字的指针(4个可见的字符加上nul终止符)。因此,它是:(a)不可修改;(b)即使是,它也不够大,无法容纳并置结果。

要解决此问题,请将其声明filename足够存储连接结果的非恒定字符数组。在下面的代码中,我最多允许10个字符(9个加上终止符),这在你的示例中就足够

要解决第一点,你需要在else子句中返回某些内容

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

char* getSegment(char* symbol2, char* symbol3, char* filename)
{
    if (strcmp(symbol2, "static") == 0) return strcat(filename, symbol3);
    else return filename; // return unmodified source string
}

int main()
{
    char* symbol2 = "static";
    char* symbol3 = "asdf";
    char filename[10] = "zxcn"; // Both NON-CONSTANT and LARGE ENOUGH!
    printf("%s\n", getSegment(symbol2, symbol3, filename));
    return 0;
}

但是,请注意,getSegment此处函数会修改给定的filename参数(这是导致问题的原因)。如果你想它来创建一个新的字符串(从串联或只是一个副本原件),那么你必须做新的字符串自己的分配(和你需要free的内存main,当你与完成它)。

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

char* getSegment(char* symbol2, char* symbol3, char* filename)
{
    if (strcmp(symbol2, "static") == 0) {
        char* answer = malloc(sizeof(char) * (strlen(filename) + strlen(symbol3) + 1));
        strcpy(answer, filename);
        strcat(answer, symbol3);
        return answer;
    }
    else {
        return strdup(filename);
    }
}

int main()
{
    char* symbol2 = "static";
    char* symbol3 = "asdf";
    char* filename = "zxcn";
    char* result = getSegment(symbol2, symbol3, filename);
    printf("%s\n", result);
    free(result);
    return 0;
}