C增量更新字符串

C增量更新字符串,c,pointers,heap-memory,c-strings,function-definition,C,Pointers,Heap Memory,C Strings,Function Definition,我正在尝试在C中逐步更新字符串。我尝试的代码如下: #include <stdlib.h> #include <stdio.h> int writech(char **text, char ch) { **text = ch; return 1; } char *write(int array[], size_t size) { char *string = (char*)malloc(sizeof(char)*(size+1));

我正在尝试在C中逐步更新字符串。我尝试的代码如下:

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

int writech(char **text, char ch) {
    **text = ch;

    return 1;
}

char *write(int array[], size_t size) {
    char *string = (char*)malloc(sizeof(char)*(size+1));
    int i, n;

    for (i = 0; i < size; ++i) {
        n = writech(&string, '0' + array[i]);
        string += n;
    }

    return string;
}

int main() {
    int arr[] = { 1, 2, 3, 4, 5 };
    char *str = write(arr, sizeof(arr)/sizeof(arr[0]));

    printf("%s\n", str);

    return 0;
}
char *render_table() {
    char *table = malloc(sizeof table);

    write_header(table);
    write_row(table, some_data);
    write_row(table, some_data);
    write_footer(table)

    return table;
}
为了实现这个伪代码,我编写了上面的代码,但无法成功地更新传递的字符串。我知道指针作为副本传递给函数,并将字符串的内存(
writech(&string
)传递给函数,但是
string
仍然没有更新。我缺少什么


p.S.作为C语言的初学者,调整指针对我来说确实很困难。你有什么建议?

string
更新了。问题是指针
string
更新了,字符串开头的信息丢失了。你必须保留信息

还有一点是必须添加终止空字符以传递
%s
的缓冲区(不指定要打印的长度)

还请注意,C中
malloc()
的强制转换结果为

试试这个:

char *write(int array[], size_t size) {
    char *string = malloc(sizeof(char)*(size+1));
    char *cursor = string;
    int i, n;

    for (i = 0; i < size; ++i) {
        n = writech(&cursor, '0' + array[i]);
        cursor += n;
    }
    writech(&cursor, '\0');

    return string;
}
char*写入(int数组[],大小){
char*string=malloc(sizeof(char)*(size+1));
char*cursor=string;
inti,n;
对于(i=0;i
在我看来,您使这项工作变得比需要的复杂得多

简单地做:

for (i = 0; i < size; ++i) {
    string[i] = '0' + array[i]);
}
string[i] = '\0';
把它叫做:

for (i = 0; i < size; ++i) {
    writech(string + i, '0' + array[i]);
}
string[i] = '\0';
(制作类似的B和C版本)

并像这样称呼他们:

char* string malloc(....);
int idx = 0;

idx += writeSomethingA(string + idx, ... other arguments ...);

idx += writeSomethingB(string + idx, ... other arguments ...);

idx += writeSomethingC(string + idx, ... other arguments ...);

string[idx] = '\0';

首先,不清楚为什么函数
writech

int writech(char **text, char ch) {
    **text = ch;

    return 1;
}
第一个参数的类型为
char**
,而不是
char*

该函数的定义如下

int writech( char *text, char ch ) {
    *text = ch;
    return 1;
}
在函数
write
中,for循环中的指针
string
正在更改。因此,函数返回一个不指向分配内存开头的指针

此外,当您使用转换说明符%s在main中输出字符数组时,该数组应包含一个字符串。也就是说,该数组应包含终止的零字符
'\0'

该功能可以通过以下方式实现

char * write( const int array[], size_t size ) {
    char *string = malloc( size + 1 );

    if ( string != NULL )
    {
        char *p = string;

        while ( size-- ) {
            p +=  writech( p, '0' + *array++ );
        }

        *p = '\0';
    }

    return string;
}
在退出main之前,您应该释放分配的内存

free( str );

write()中的
返回字符串;
返回几个加法后的值,即:返回字符串的结尾。您需要保留字符串原始开头的副本,然后返回。感谢您的解决方案。使用这种方法,我应该在哪里释放分配给游标和字符串的内存?@ElginCahangirov for
游标
没有任何可释放的内容。Th在
printf
之后,应在
main
中释放e字符串,即
free(str)
谢谢你的建议。但是你的解决方案并不符合我的目标,因为我事先不知道要写多少个字符。代码中的for循环只是为了表示我真正的问题。请参阅伪代码了解真正的任务。@ElginCahangirov你说的“我事先不知道要写多少个字符”是什么意思?将大小传递给函数,例如,write_头(表);类似这样的函数可能会根据某些样式或其他条件写入不同数量的字符。这样,我会在writech函数末尾返回
int
,然后使用此int来递增指针。是的,将递增指针传递给函数是个好主意。但我认为上面建议的解决方案更简洁。感谢您的努力@ElginCahangirov没问题-您可以自由选择您喜欢的答案。我建议您不要传递
&游标
。没有理由按地址传递它,这会使您的代码混淆,并且会影响性能。只需传递
游标
-就可以添加到字符串中。
char * write( const int array[], size_t size ) {
    char *string = malloc( size + 1 );

    if ( string != NULL )
    {
        char *p = string;

        while ( size-- ) {
            p +=  writech( p, '0' + *array++ );
        }

        *p = '\0';
    }

    return string;
}
free( str );