只是尝试创建一个简单的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, "...", ...);
好的...
sprintf()需要一个可变缓冲区作为它的第一个参数.你没有通过,所以你会在这里得到各种不良行为.在此功能之外分配内存.所以:
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)
| 归档时间: |
|
| 查看次数: |
5214 次 |
| 最近记录: |