c - sprintf 和分配内存

标签 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 则会导致缓冲区溢出。请帮助我。

最佳答案

如果你想安全地将数据输出到缓冲区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);

关于c - sprintf 和分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20236838/

相关文章:

将十进制数转换为十六进制数

c - 在不安装的情况下构建嵌套的 Autotools 包

C - Malloc 导致程序崩溃

有人能告诉我为什么我会在这个简单的 C 程序中出现段错误吗?

c - 无法在结构中分配字符串

c++ - 如何让一个类作为 printf_s/sprintf_s 的字符串?

c - 尝试编译 valkyrie(valgrind 的 GUI) 并抛出错误 :

c - 严格别名是单向的吗?

objective-c - 如何检查两个格式字符串是否兼容?

haskell - 将 double 列表格式化为字符串