c - 带参数函数的 printf 返回指向 char 的指针

标签 c printf

你好我试着设置一个代码

#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()< 中的返回值有误?/?

感谢您的帮助。

最佳答案

因为 bufferstatic,所以对 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;
}

wandbox example


如果你真的想使用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;
}

wandbox example

关于c - 带参数函数的 printf 返回指向 char 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40803197/

相关文章:

c - 在C中,node.next->prev与node->next->prev相同吗?

objective-c - 在 switch 语句中声明变量

c - 如何在c中实现我自己的printf

c - Printf算术运算优先级下

Python 和 ctypes : why printf ("%f", 10.1) 是错误的

c - 一行打印多个\t

从数组中选择一个字符,然后替换第二个数组 - C

c - ARM NEON 8x8 SAD 操作

c - 十五人游戏中移动方 block 的问题

C++ 打印 : newline (\n) from commandline argument