gpt4 book ai didi

c函数返回sprintf字符串

转载 作者:太空宇宙 更新时间:2023-11-04 05:26:30 27 4
gpt4 key购买 nike

只是想制作一个简单的 toString 函数,但我很难弄清楚如何在不必创建临时变量的情况下创建 sprintf 样式的字符串。

即如果以下方法有效,那就太好了

#myfile.c
bool status;
int state;
...
const char* myfileToString(void) {
return sprintf("myfile::status=%s;state=%d;", \
status ? "true" : "false", \
state);
}

这行不通,因为 sprintf 需要您先创建字符串,然后将其传递给函数。

即我相信以下作品

#myfile.c
bool status;
int state;
...
const char* myfileToString(void) {
char ret[40];
sprintf(ret, \
"myfile::status=%s;state=%d;", \
status ? "true" : "false", \
state);
return ret;
}

有没有我可以使用的另一个函数来代替 sprintf 或者我可以用 sprintf 做一些奇怪的事情比如传递一些指针直接返回 sprintf(*return, "...", ...);

最佳答案

好的...

第 1 部分:

  • 除非您正在编写宏,否则您不需要在未完成的行末尾使用反斜杠。
  • sprintf() 需要一个可变缓冲区作为第一个参数。你没有通过一个,所以你会在这里遇到各种不良行为。

第 2 部分:

  • 你正在返回一个指向堆栈分配对象的指针。这将导致未定义的行为。

你应该做什么:

在此函数之外分配内存。所以:

void myfileToString(const char *str, size_t len) {
snprintf(str, len, "myfile::status=%s;state=%d;",
status ? "true" : "false",
state);
str[len - 1] = '\0';
}

你可以这样调用它:

char box[40];
myfileToString(box, sizeof(box) /* 40 */);

让它更可靠:

sprintf() 函数系列返回写入缓冲区的字符数。如果写入的字符数大于缓冲区的大小,您可以使用它来发回错误(例如 true 或 false 返回值)。

最后,你可以使用堆:

这不是最好的做法,因为它会打乱人们的预期。但是您可以在堆上为这些数据分配内存。以后您需要记住对其调用 free()

const char *myFileToString() {
char *str = malloc(40);
snprintf(str, 40, "myfile::status=%s;state=%d;",
status ? "true" : "false",
state);
str[40 - 1] = '\0';
}

关于c函数返回sprintf字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25019176/

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