一个不适用于gcc的代码

时间:2015-04-17 21:56:02

标签: c gcc

我在visual studio中写了一个计算器程序。但我需要它与DEVC ++一起运行。但我的代码不适用于gcc编译器。以下是代码的一小部分不起作用。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>

int main(){

    long double var1 = 0, var2= 0, memory, result;
    char wordInput[50] = { 0 };
    char *endPtr1, *endPtr2;

    printf("Enter an input: ";
    scanf("%[^\n]%*c", wordInput);

    var1 = strtold(wordInput, &endPtr1);
    printf("%.4f", var1);

}

这是代码块,我获取输入并将其转换为double并分配给var1。当我使用visual studio进行编译时,它可以工作(它打印输入的数字)但是使用devc ++它不会(它打印0.0000)。我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:3)

试试这个

#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>

....

    printf("%.4Lf", var1);

答案 1 :(得分:2)

更新:我的回答解释了这个问题。 BLUEPIXY's answer提供了可能是最佳解决方案。


DevC ++使用gcc的MinGW端口。默认情况下,MinGW使用gcc编译器和Microsoft的运行时库。

问题是gcc和Microsoft的运行时库对类型long double的表示方式有不同的看法。当您打印var1

的值时
printf("%.4f", var1);

您将gcc样式的long double值传递给Microsoft的printf,后者需要Microsoft样式long double。 (一个是64位,与double相同的大小和表示;另一个是更大的,具有更大的范围和精度。)而且你也使用了不正确的格式。 %.4f需要double类型的参数;您需要%.4Lf才能打印long double。不幸的是,由于MinGW中的错误,这在这种情况下无济于事。

作为一种变通方法,您可以将var1的值从long double转换为double,gcc和Microsoft的运行时库都会始终如一地处理:

printf("%.4f", (double)var1);

(这不是gcc或Microsoft运行时库中的错误,每个都是内部一致的。long double的大小是实现定义的,并且两个实现都做出了有效的选择。这是MinGW中的一个错误整合这两个组成部分。)