gtk_init更改了sprintf的功能

4
我开始使用Linux和GTK,并遇到了一个奇怪的问题。我在代码中使用sprintf()将float解析为char数组。
当解析数字1成字符串时,结果为"1.000000",但是,在调用gtk_init()后再次使用sprintf()时,结果为"1,000000"。gtk_init()如何修改此行为,如何强制程序继续解析为"1.000000"。
这是可以重现问题的小示例程序:
#include <gtk/gtk.h>

int main(int argc, char** argv)
{
    char cMessage[12];
    float fNumber = 1;
    sprintf(cMessage, "T:%f", fNumber);
    printf("%s\n", cMessage);

    gtk_init(&argc, &argv);

    sprintf(cMessage, "T:%f", fNumber);
    printf("%s\n", cMessage);

    return 0;
}

该程序的输出如下所示:
T:1.000000
T:1,000000

3
似乎是本地化问题。如果您在主函数中的第一行加入 setlocale(LC_ALL, "en_US.UTF-8");,是否有帮助? - Blaze
不是你的问题,但是这段代码中的 char cMessage[12] 很容易出现意外。如果格式化字符串的长度稍微超过你的预期,那么这个缓冲区就会非常有限。我建议使用 (a) char cMessage[30],或者更好的方法是 snprintf(cMessage, sizeof(cMessage), "T:%f", fNumber); - Steve Summit
1个回答

7

这与您的地区/语言环境有关。在调用 gtk_init 之前,您的 LOCALE 变量必须设置为默认值 C。gtk_init 默认将区域设置为您的桌面环境所设定的相应值。

如果要关闭此行为,可以使用 gtk_disable_setlocale


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接