你好我试着设置一个代码
#include <stdio.h>
struct _data;
typedef struct _data data;
typedef struct _data {
double x;
double y;
} data;
const char* data_tostring(data* a) {
static char buffer[255];
sprintf(buffer, "%f %f", a->x, a->y);
return buffer;
}
int main(){
data a;
data b;
a.x = 0;
a.y = 0;
b.x = 1;
b.y = 1;
printf("%s %s \n", data_tostring(&a), data_tostring(&b));
return 0;
}
我预计输出是 0 0 1 1,但实际上我得到了 0 0 0 0。我是否在 static
关键字和 data_tostring()< 中的返回值有误?/
?
感谢您的帮助。
最佳答案
因为 buffer
是static
,所以对 data_tostring(...)
的两次调用都写入同一个缓冲区。此外,未指定函数参数的求值顺序,因此无法保证 data_tostring(&a)
在 data_tostring(&b)
之前求值。
解决此问题的一种可能方法是将 buffer
作为参数传递给 data_tostring
:
void data_tostring(char* buffer, data* a) {
sprintf(buffer, "%f %f", a->x, a->y);
}
然后在main
中使用多个缓冲区:
int main()
{
data a;
data b;
char a_buf[255];
char b_buf[255];
a.x = 0;
a.y = 0;
b.x = 1;
b.y = 1;
// Fill buffers
data_tostring(a_buf, &a);
data_tostring(b_buf, &b);
printf("%s %s \n", a_buf, b_buf);
return 0;
}
如果你真的想使用static buffer
,你可以调用printf
两次:
int main()
{
data a;
data b;
a.x = 0;
a.y = 0;
b.x = 1;
b.y = 1;
printf("%s", data_tostring(&a));
printf(" %s \n", data_tostring(&b));
return 0;
}
关于c - 带参数函数的 printf 返回指向 char 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40803197/