c函数返回sprintf字符串

use*_*250 0 c string

只是尝试创建一个简单的toString函数,但我很难弄清楚如何创建一个sprintf样式字符串而无需创建临时变量.

即如果以下工作将会很棒

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

这将无法工作,因为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;
}
Run Code Online (Sandbox Code Playgroud)

是否有另一个函数,我可以使用而不是sprintf或者我可以用sprintf做一些奇怪的事情,就像传递一些指针直接返回 sprintf(*return, "...", ...);

Bil*_*nch 5

好的...

第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';
}
Run Code Online (Sandbox Code Playgroud)

你会这样做:

char box[40];
myfileToString(box, sizeof(box) /* 40 */);
Run Code Online (Sandbox Code Playgroud)

使这更可靠:

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';
}
Run Code Online (Sandbox Code Playgroud)