sprintf和分配内存

时间:2013-11-27 08:00:04

标签: c malloc printf dynamic-memory-allocation

我有一个结构,我存储了一些值,如下所示:

struct cmd { 
    char *pname;
    char *pdesc;
}; 

在初始化之后我做了:

struct cmd[] = {{"show", "show items"},
                {"exit", "exit the shell"},
                {"setitem",   "setting item"}
               };    

我正在使用sprinf()通过存储所有pname和pdesc进行打印,如下所示

int length = 0;    
char *resultcmd;    
for (indx = 0; indx< cmdCount; indx++) {
     length += sprintf(resultcmd+length, cmd[indx].pname, cmd[indx].pdesc);    
}    

请帮我如何为resultcmd分配内存,当我将resulecmd作为一些长度的数组时,它有效,但如果添加更多pname和pdesc缓冲区溢出。请帮帮我。

2 个答案:

答案 0 :(得分:2)

您可以使用snprintf(char *dest, size_t maxlen, char *fmt, ...)来限制打印件的大小。如果函数失败,它会返回已写入的字符数,如果有足够的空间;所以+1是realloc所需要的。

答案 1 :(得分:2)

如果您想安全地将数据输出到缓冲区resultcmd,您必须先找出它的长度并使用它:

size_t length = 1; // 1 symbol needed to store \0', 
                   // because strlen() returns length 
                   // without NULL-termination symbol
// compute length:
for (intx = 0; indx < cmdCount; indx++) {
     length += strlen(cmd[indx].pname) + strlen(cmd[indx].pdesc);
}

char *resultcmd = malloc(length);
int written = 0, ret = 0;

// print cmds to C string
for (indx = 0; indx < cmdCount; indx++) {
     ret = snprintf (resultcmd + written, length - written, 
                     "%s%s", cmd[indx].pname, cmd[indx].pdesc))
     if (0 > ret) {
         fprintf (stderr, "snprintf() error: %s\n", strerror(errno));
         break;
     } else {
         written += ret;
     }
}
/* 
 * some useful code here
 */
free(resultcmd);