如何从char数组构建char**

如何从char数组构建char**,c,arrays,string,struct,C,Arrays,String,Struct,请查看以下代码: #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"},

请查看以下代码:

#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生成文本的好方法吗

是的,除了
asprintf
不可移植之外(尽管对于没有它的平台,您可以用
snprintf
轻松定义它),并且您没有检查错误返回<代码>无效主代码无效

有没有一种更好的方法来定义cmd,以避免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
size\u ti,siz=1;//1表示NUL char

对于(i=0;首先,这段代码没有编译。@cnicutar,你的答案至少有一半是正确的…
void main
是这里的问题。@sarnold哪部分是正确的?这段代码只释放asprintf分配的内容。@Jim,正确的一位指出
if(i>0)
构造是必要的,因为初始的
不是由
malloc分配的(3)
.larsmans的答案是解决潜在问题的一个明显更好的方法,但我认为他在指出一些笨拙的代码时做得很好。sizeof将返回尾随“\0”的空格,整个字符串只需要一次。@yi\u H:是的,但这样一点过度分配不会有什么坏处,是吗?“我不知道——温特沃斯先生只是让我进来说磨坊里出了麻烦,仅此而已——我没想到会有西班牙宗教法庭。”谢谢你的回答。我在谷歌上搜索了一下̀
void main(void)
以后将避免使用它。@Nils:我没有时间编译和运行它,但现在看起来很好。
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