我在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)。我该怎么做才能解决它?
答案 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中的一个错误整合这两个组成部分。)