0

我正在尝试编写一个函数将采用 char 然后生成在堆中分配的 char* 。我怎样才能做到这一点 ?注意:下面的代码不起作用,你能帮忙修复吗

Ex:

    char* foo ( char x, char * xc ) {


        xc =  realloc ( xc, 1 + strlen ( xc ) ) ;
        strcat ( xc, x ) ;

    return xc ;
    }

                             p =  heap variable
   foo ( 'a', NULL ) ==>     ------------
                             | 'a'| '\0'|
                             ------------

   foo ( 'b', p )    ===>    --------------------
                             | 'a' | 'b' | '\0' |
                             --------------------

   foo ( 'c', p )    ===>    --------------------------
                             | 'a' | 'b' | 'c' | '\0' |
                             --------------------------
4

5 回答 5

3

NULL不是一个字符串,因此你不能调用strlen它。

size_t len = xc != NULL ? strlen(xc) : 0;
xc = realloc(xc, len + 1 + 1);
xc[len] = c;
xc[len + 1] = '\0';
于 2012-05-04T06:42:15.273 回答
1

strcat接受两个指针。在您的示例中,您将一个字符作为第二个参数传递

改用s(n)printf函数族将字符连接到字符串。

就像是

len =strlen(xc);
xc =  realloc ( xc, 2 + strlen ( xc ) ) ; //One for NULL character

sprintf(xc+len,"%c", x);
于 2012-05-04T06:39:45.583 回答
0

有两个问题

  • 如果您的指针为 NULL,您将在该地址上调用 strlen。
  • 您分配的内存不足
int len = 2;
if ( xc != NULL ) {
   len += strlen( xc );
}
xc = realloc( xc, len );
*(xc+len-2) = x;
*(xc+len-1) = '\0';
于 2012-05-04T06:44:14.513 回答
0

试试这个 :

char* append_char(char c, char * str)
{
    char* new_str;

    if(NULL != str) {
        new_str = realloc(str, strlen(str) + 2);
        strncpy(new_str, str, strlen(str));
        new_str[strlen(str)] = c;
        new_str[strlen(str)+1] = '\0';
    } else {
        new_str = malloc(2);
        new_str[0] = c;
        new_str[1] = '\0';
    }

    return new_str;
}
于 2012-05-04T06:58:08.537 回答
0

我可以分享一个小草图。

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

int sl = 0; // sl for strlen(s), allocated memory size will be +1 byte
char* s = NULL;

char* ccat(char* s, char c) {
    if (s == NULL) sl = 1; // allocating new memory
    else           sl = strlen(s) + 1; // +1 for new char
    // realloc will work like malloc if s is NULL
    s = realloc(s, sl+1); // +1 for zero at the end of string
    if(s == NULL) {
        fprintf(stderr, "realloc error");
        exit(1);
    }
    s[sl-1] = c;
    s[sl] = '\0';
    return s;
}

int main(int argc, char** argv) {
    s = ccat(s, 'Y');
    printf("sl=%d s=%s\n", sl, s);

    s = ccat(s, 'P');
    printf("sl=%d s=%s\n", sl, s);

    s = ccat(s, 'A');
    printf("sl=%d s=%s\n", sl, s);

    if (s != NULL)
        free(s);
    exit(0);
}
于 2012-05-04T07:21:26.620 回答