我有一个结构,其中存储了一些值,如下所示:
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/