如何解决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 举报,一经查实,本站将立刻删除。