c - sprintf 的什么输入会产生 0 个结果?

标签 c printf uint64 xlc

我正在尝试调试与此特定代码无关的问题,我正在寻找线索,线索是“这个计数器可能有什么值(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/

相关文章:

c - 使用 3D 数组 - 无法进行输出

c - 使用二维数组的 malloc 和 strtok

c - 使用 scanf 处理多种数据类型

r - 如何在不使用列名的情况下在 flextable 对象中指定大标记分隔符?

java - 如何使用 printf() 和可变宽度使字符串输出居中?

c - 为什么这个条件总是正确的? (pktNum != invPktNum)

c - fprintf 导致控制台应用程序崩溃

ios - NSMutableIndexSet 添加索引 : Method Throws Error

iOS UInt64 数字 float 错误

ios - 大于 Int64 的整数