我想问我失败的代码

时间:2016-10-27 08:22:21

标签: c

这是一项在21天内自学c的练习。

问题是:编写一个接受两个字符串的函数。使用malloc()函数分配足够的内存以在连接后保存两个字符串。返回指向这个新字符串的指针。

所以,我是第一个代码。但是不能操作。代码中的函数如下:

 char *concate(char *p, char *q)
 {
    int i, len;
    char *r;

    if((r = (char *)malloc(100)) == NULL){
        printf("Allocate failed\n");
        exit(1);
    }


    r = p;
    for(i = 0; r[i] != '\0'; ++i)
            ;
    len = i;
    for(i = 0; q[i] != '\0'; ++i, ++len)
         r[len] = q[i];

    return r;
}

没有编译错误但运行时错误。

因为我只想使用指针变量来解决这个问题。

但我不知道,使用以下代码解决问题。

char *concate(char *p, char *q)
{
    int i, len;
    char *r;

    if((r = (char *)malloc(1000)) == NULL){
        exit(1);
     }

    for (i = 0; p[i] != '\0'; ++i)
        r[i] = p[i];

    len = i;

    for(i = 0; q[i] != '\0'; ++i, ++len)
        r[len] = q[i];

    r[len] = '\0';


    return r;
}

这段代码可以运行,可以让我想要结果。

我的问题是,我怎样才能使用指针变量得到结果?

我想使用*p, *q, *r和指针算术以及一些变量(i for loop)。

我解决了问题,但感觉不好,因为我使用数组来解决这个问题。

请帮帮我!谢谢。

***我问过如何使用指针变量才能表达(解决)上面的问题。

3 个答案:

答案 0 :(得分:2)

首先,您将100的内存分配为随机值,希望它足够了。找到每个字符串的长度并为组合长度分配内存是一种更好的方法。

其次,使用r = p;覆盖指向已分配内存的指针。您需要使用strcpy将字符串从r复制到p

以下是仅使用指针的解决方案

char *concate(char *p, char *q)
{
    int i, len=0, ;
    char *r, *temp;

    temp = p;
    for(; *temp ; ++temp)
            len++;
    temp = q;        
    for(; *temp ; ++temp)
            len++;

    if((r = malloc(len+1)) == NULL){
        printf("Allocate failed\n");
        exit(1);
    }

    for (temp = r; *p; p++, temp++)
       *temp = *p;

    for (; *q; q++, temp++)
       *temp = *q;

    *temp = '\0'; 

    return r;
}

答案 1 :(得分:0)

问题是您正在覆盖

malloc返回的地址
if((r = (char *)malloc(100)) == NULL){
    printf("Allocate failed\n");
    exit(1);
}
r = p; /* Memory leak */

因此,您没有空间存储结果,请更改为

strcpy(r, p);

答案 2 :(得分:0)

可能低于答案就是你要找的。

char *concate(char *p, char *q)
{
    char *res = p;

    while (*p)
        *p++;

    *p--;

    while (*q)
    {
        *p++;
        *p = *q;
        *q++;
    }
    *++p = *q;

    return res;
}

我们可以更优化它。 如果我错过了什么,请告诉我