我正在尝试调试与此特定代码无关的问题,我正在寻找线索,线索是“这个计数器可能有什么值(value)?”下面一行代码
sprintf(strAtLeast10long, "%lld%c%.02uP",
input/peta, decimal, (long)((input%peta) / (peta/hundred)));
正在为输出生成“0.00P”。
这是我对参数的了解。输入是一个 unsigned long long
,其值 >= (10^12 - (10^7/2))。 十进制 = '.'
static const long long hundred = 100;
static const long long peta = 1000000000000000ULL;
是的,我知道 "%lld"
会比 "%llu"
更好,我会解决这个问题。
但与此同时,我正在寻找有关输入内容的线索。该问题发生在客户身上,我们不知道如何重现它,因此添加调试代码或使用调试器不是一种选择。
编译器是 IBM z/OS C++ 编译器。在你们翻白眼并说“EBCDIC 是魔鬼的杰作!”之前它是符合 Posix 标准的 C++ 编译器和环境。
最佳答案
使用您以最直接的方式提供的所有信息产生描述的输出 0.00P
unsigned long long input=999995000000ULL;
(据我所知,这是给定范围内允许的最低值)
对于
unsigned long long input=9999999999999ULL;
,我认为这是指定输出的最大值。
假设两者之间的任何值也给出相同的输出是合理的。
你得到 0.01P
unsigned long long input = 10000000000000ULL;
,高一。
这是我的游戏代码,
请检查是否与您描述的内容有任何冲突
(我将格式说明符字符串改编为我的编译器,gcc 版本 4.9.2 (tdm-1),目标:mingw32)。
#include <stdio.h>
int main(void)
{
char decimal='.';
char strAtLeast10long[]=" \0";
static const long long hundred = 100;
static const long long peta = 1000000000000000ULL;
//unsigned long long input= 9999999999999ULL;
//unsigned long long input= 999995000000ULL;
unsigned long long input = 10000000000000ULL;
sprintf(strAtLeast10long, "%I64u%c%.02luP", input/peta, decimal, (long)((input%peta) / (peta/hundred)));
printf("%s\n", strAtLeast10long );
return 0;
}
此答案与同时出现的 xing 的评论一致。
关于c - sprintf 的什么输入会产生 0 个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086979/