微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C逐步更新字符串

如何解决C逐步更新字符串

我正在尝试逐步在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;
}

这里,write函数应通过调用其他函数来更新string,并在最后返回更新后的string。尽管str(在main末尾)为空,但代码已成功编译并运行。实际上,我的任务是创建一个包含一些数据表的字符串,并在最后将其返回。我的想法的伪代码如下:

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()的转换结果为discouraged

尝试一下:

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;
}
,

在我看来,您正在使这一过程变得比所需的复杂得多。

只需:

for (i = 0; i < size; ++i) {
    string[i] = '0' + array[i]);
}
string[i] = '\0';

如果出于某些原因您确实想使用writech函数,则可以将其更改为:

void writech(char *text,char ch) {
    *text = ch;
}

并这样称呼它:

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

但这实际上只是使一个简单的任务变得复杂。

由于评论需要编辑

如果您(在您的真实代码中)不知道函数调用将添加多少个字符,您只需执行以下操作:

int writeSomethingA(char* str,... other arguments ...)
{
    // update str,e.g. like str[0] = 'a'; str[1] = 'b';
    //                  or strcpy(str,"Some text");

    return NumberOfCharAdded;
}

(制作相似的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中,指针string在for循环中被更改。因此该函数返回的指针不指向已分配内存的开头。

同样,当您使用转换说明符%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 );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。