gpt4 book ai didi

c - 如何从 char* 数组构建 char*

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:53 24 4
gpt4 key购买 nike

请看下面的代码:

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

typedef struct {
const char * cmd;
const char * help;
} CmdEnum;

static CmdEnum cmd_enum[] = {
{"help", "This help..."},
{"first", "The first command"},
{"second", "The second command"},
};

void main()
{
int i,n;
char *out = "";

n = sizeof(cmd_enum) / sizeof(CmdEnum);
for (i=0; i<n; i++)
{
char *oldOut = out;
CmdEnum cmd = cmd_enum[i];
asprintf(&out, "%s%s -> %s\n", oldOut, cmd.cmd, cmd.help);
if(i>0) free(oldOut);
}

printf("%s", out);
printf("Done.\n");
}

这是从 CmdEnum 构建文本的好方法吗?
是否有一种“更好”的方式首先定义 cmd 以避免 if(i>0) free...
还是我做错了什么?

编辑:
阅读 larsmans 的回答后,我将 main 修改为:

int main()
{
int i,n, copied, siz;
char *out, *cursor;
siz = 1;// 1 for NUL char
n = sizeof(cmd_enum) / sizeof(CmdEnum);

for (i=0; i<n; i++)
{
siz += strlen(cmd_enum[i].cmd) + strlen(cmd_enum[i].help) + strlen(":\n\t\n\n");
}

out = malloc(siz);
if(!out)
{
printf("Could not alloc!\n");
return 1;
}

cursor = out;
for (i=0; i<n; i++)
{
copied = snprintf(cursor, siz, "%s:\n\t%s\n\n", cmd_enum[i].cmd, cmd_enum[i].help);
if(copied < 0 || copied >= siz)
{
printf("snprintf failed: %i chars copied.\n", copied);
return 1;
}

cursor += copied;
siz -= copied;
}

printf("%s", out);
printf("Done.\n");
free(out);
return 0;
}

(注意:我也改了输出格式...)

最佳答案

Is this a good way to build a text from the CmdEnum?

是的,除了 asprintf 不可移植(尽管对于没有它的平台,您可以根据 snprintf 轻松定义它)并且您不是检查错误返回。 void main 不是有效的 C 顺便说一句。

Is there a "nicer" way do define cmd in the first place as to avoid the if(i>0) free...?

您可以预先分配整个字符串。

size_t i, siz = 1;  // 1 for NUL char
for (i=0; i<n; i++)
siz += strlen(cmd_enum[i].cmd) + strlen(cmd_enum[i].help) + strlen(" -> \n");

char *out = malloc(siz);
// check for errors

然后使用snprintf 构建字符串。这为您节省了一些 malloc 和循环中的错误检查。

关于c - 如何从 char* 数组构建 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6608160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com