intN_t
类型有新的格式说明符,例如%"PRIiN"
和%"SCNiN"
,用于printf
和scanf
函数族。
如果有的话,float_t
和double_t
的新格式说明符是什么? (在math.h
中定义)
我可以 - 使用%f
和%lf
吗?我不这么认为,因为float_t
只是至少和float
一样大,但可以定义为long double
。
没有人回答,我在任何地方找不到答案,可能是C中的错误?
要谨慎和便携,你可以在你的%Lf
控制字符串中使用printf
并将float_t
或double_t
类型的值转换为long double
。
编辑:long double的格式说明符是%Lf
而不是%lf
你必须对scanf更加谨慎,因为在这种情况下,施法对你没有帮助。
或者你可以为printf
和scanf
定义你自己的float_t
和double_t
格式说明符,利用FLT_EVAL_METHOD
[1]宏来找出float_t
和double_t
分别相当于哪些内置类型。
标准中不存在这些,因此您必须自己使用FLT_EVAL_METHOD
(C11 7.12.2)来定义它们。
我将分享我在我的库中编写的代码来执行此操作:
#if (FLT_EVAL_METHOD == 0)
#define PRIaFLT "a"
#define PRIAFLT "A"
#define PRIeFLT "e"
#define PRIEFLT "E"
#define PRIfFLT "f"
#define PRIFFLT "F"
#define PRIgFLT "g"
#define PRIGFLT "G"
#define SCNaFLT "a"
#define SCNeFLT "e"
#define SCNfFLT "f"
#define SCNgFLT "g"
#define PRIaDBL "la"
#define PRIADBL "lA"
#define PRIeDBL "le"
#define PRIEDBL "lE"
#define PRIfDBL "lf"
#define PRIFDBL "lF"
#define PRIgDBL "lg"
#define PRIGDBL "lG"
#define SCNaDBL "la"
#define SCNeDBL "le"
#define SCNfDBL "lf"
#define SCNgDBL "lg"
#elif (FLT_EVAL_METHOD == 1)
#define PRIaFLT "la"
#define PRIAFLT "lA"
#define PRIeFLT "le"
#define PRIEFLT "lE"
#define PRIfFLT "lf"
#define PRIFFLT "lF"
#define PRIgFLT "lg"
#define PRIGFLT "lG"
#define SCNaFLT "la"
#define SCNeFLT "le"
#define SCNfFLT "lf"
#define SCNgFLT "lg"
#define PRIaDBL "la"
#define PRIADBL "lA"
#define PRIeDBL "le"
#define PRIEDBL "lE"
#define PRIfDBL "lf"
#define PRIFDBL "lF"
#define PRIgDBL "lg"
#define PRIGDBL "lG"
#define SCNaDBL "la"
#define SCNeDBL "le"
#define SCNfDBL "lf"
#define SCNgDBL "lg"
#elif (FLT_EVAL_METHOD == 2)
#define PRIaFLT "La"
#define PRIAFLT "LA"
#define PRIeFLT "Le"
#define PRIEFLT "LE"
#define PRIfFLT "Lf"
#define PRIFFLT "LF"
#define PRIgFLT "Lg"
#define PRIGFLT "LG"
#define SCNaFLT "La"
#define SCNeFLT "Le"
#define SCNfFLT "Lf"
#define SCNgFLT "Lg"
#define PRIaDBL "La"
#define PRIADBL "LA"
#define PRIeDBL "Le"
#define PRIEDBL "LE"
#define PRIfDBL "Lf"
#define PRIFDBL "LF"
#define PRIgDBL "Lg"
#define PRIGDBL "LG"
#define SCNaDBL "La"
#define SCNeDBL "Le"
#define SCNfDBL "Lf"
#define SCNgDBL "Lg"
#endif
然后你应该能够做到:
double_t x;
scanf(" %"SCNaDBL"", &x);
printf("x = %"PRIaDBL"\n", x);