将双精度型转换为字符串时:
static void strfromdouble(char *buf, size_t n, double d) {
snprintf(buf, n, "%.14g", d);
}
在调用buf[0]
之后,哪个字符可能会以snprintf
结尾?
很明显,它可能是以下之一:0-9
,-
,.
,但是由于我们在这里使用浮点数学运算,因此可能会有更多的字符结尾buf[0]
类似于{{1}的I
或Inf
的{{1}},甚至更多?
在这种情况下,N
的行为是否跨不同的编译器和平台进行了标准化?如果是,那么规范在哪里,即我在哪里可以查询我的代码在NaN
中必须能够处理哪些字符?
答案 0 :(得分:1)
将双精度型转换为字符串时,第一个字符串字符是什么?
易于生成"0123456789-+ iInN"
。但是其他char
也是可能的,具体取决于我们要延伸多远。
很明显,它可能是以下之一:
0-9
,-
,.
,但是由于我们在这里使用浮点数学运算,因此可能会有更多的字符结尾buf [0]类似于{{1}的I
或Inf
的{{1}},甚至更多?
N
在NaN
时,期望snprintf(buf, n, "%.14g", d);
当n = 1
时,期望buf[0] == '\0'
保持不变,因此在这里可能任何 n = 0
值。
使用buf[0]
和char
我都不希望"%.14g"
和'I'
,而是'N'
和'i'
。
'n'
将产生"%.14G"
和'I'
。
这种格式不会出现前导'N'
。
对于其他语言环境,(研究'.'
),setlocale()
可能是其他东西。我不知道该怎么做。
其他格式
使用其他格式的'-'
字符串:
第一个字符可以是空格"% something [gefaGefa]"
或' '
。像'+'
一样,它随 locale 的不同而不同。
如果可以使用前导'-'
(我相信使用标准格式是不可能的),则其他语言环境可以使用诸如'.'
之类的替代语言。
使用特定于实现的格式,任何主角字符都是可能的。
在格式无效的情况下,由于未定义的行为,任何主角字符都是可能的。
','
输出
#include <stdio.h>
int main(void) {
char s[1000];
double inf = strtod("inf", 0);
double nan = strtod("nan", 0);
snprintf(s, sizeof s, "%g\n", 0.0); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%g\n", 9.0); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%g\n", -1.0); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%+g\n", +1.0); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%g\n", inf); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%G\n", inf); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%g\n", nan); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%G\n", nan); printf("%3d %.1s\n", s[0], s);
snprintf(s, sizeof s, "%5g\n", 1.0); printf("%3d %.1s\n", s[0], s);
snprintf(s, 1, "%g\n", 1.0); printf("%3d %.1s\n", s[0], s);
s[0] = 'z';
snprintf(s, 0, "%g\n", 1.0); printf("%3d %.1s\n", s[0], s);
return 0;
}
在这种情况下,snprintf的行为是否跨不同的编译器和平台进行了标准化?
是的。兼容的可能性包括 48 0
57 9
45 -
43 +
105 i
73 I
110 n
78 N
32
0
122 z
。一些编译器可能会添加其他定义的实现。
规范(?)在哪里
查找C规范。最新的是C17
Where do I find the current C or C++ standard documents?
详细信息:
"0123456789-+ iInN"