【问题标题】:Problems with implementation of concatenation function in C在 C 中实现连接函数的问题
【发布时间】:2013-02-19 19:18:55
【问题描述】:

我还是 C 中的指针的新手,并且一直在尝试制作字符串函数。这个应该连接两个字符串,但是当我尝试运行它时,它崩溃了。

void concatenate (char *a, char *b, int size_a, int size_b) {
    char *c, *d, *e;
    c = a;
    d = b;
    int i, j, k;
    int l = 1;

    for(i = 0; i<size_a; i++) {
        *(e+i) = *(c+i);
    }
    for (j = size_a; j<size_a+size_b; j++) {
        *(e+j) = *(d+(j-(j-l)));
        l++;
    }
    for (k = 0; k< size_a+size_b; k++){
        printf("%c",*(e+k));
    }
}

我做错了什么?

【问题讨论】:

  • 编译器崩溃?真的吗?你能显示错误信息吗?
  • 不仅您的函数将char *achar *b 作为参数(无意义的名称),而且它的主体甚至以char *c, *d, *e; c = a; d = b; 开头
  • 提示 - e 没有指向任何东西。
  • 好吧,我希望 e 指向新字符串。我该怎么做呢?
  • ...为它分配一些内存?

标签: c string concatenation


【解决方案1】:

您正试图访问未初始化指针e 指向的内存,这会导致未定义行为

你的函数应该是这样的:

char* concatenate (const char *a, const char *b, int size_a, int size_b) {
    // create new string:
    char* newStr = malloc (size_a + size_b + 1);
    int i, j;

    // copy first string into it:
    for (i = 0; i<size_a; i++)
        newStr[i] = a[i];

    // copy second string into it:
    for (j = 0; j < size_b; j++)
        newStr[i + j] = b[j];

    newStr[i + j] = '\0';
    return newStr;
}

请注意,函数不会更改传递给它的字符串,因此它们可以作为const 传递。 size_asize_b 应该等于 strlen(a)strlen(b),这也意味着如果你总是将以 null 结尾的字符串传递给这个函数,你可以在它的主体内自己计算它们的长度(这样你就可以去掉最后两个参数)。

【讨论】:

  • 我如何得到它以便“连接”返回一个新字符串?
  • size_a 和 size_b 的计数不应该包括空终止符。那么malloc大小参数应该设置为(size_a + size_b - 1)。
  • @TallSoftwareDude:这在代码下面的行中有解释。
  • 好的,我想我现在明白了。谢谢!
  • @user2041197: 不客气 :) 也不要忘记在 concatenate 函数返回的指针上调用 free。一旦您不再需要此内存,您应该free malloc 分配的内存。
【解决方案2】:

e 是一个未初始化的指针,这意味着它指向内存中的某个随机位置。当你开始写它,就好像它是一个指向字符数组的指针一样,你的程序会崩溃(或者更糟的是,改变一些状态神秘地导致稍后未指定的行为)。

【讨论】:

    【解决方案3】:

    您的代码似乎无缘无故地被混淆了。问题是您分配给未初始化的e。以下几乎是您的代码以更易读的形式并分配了e。不过我还没有测试过。

    void concatenate (char *c, char *d) {    
        char *e; 
        e = calloc(strlen(c) + strlen(d) + 1, sizeof(char));
        int i, j;
        int l = 1;
    
        for(i = 0; c[i]; i++) {
            e[i] = c[i];
        }
        l = i;
        for (j = 0; d[j]; j++) {
            e[l + j] = d[j];
        }
        e[l + j] = '\0';
    
        printf("%s", e);
    
        free(e);
    }
    

    【讨论】:

    • 原始传递的字符串大小。这是常态,但你怎么知道字符串是空终止的?
    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多