【问题标题】:Internal working of sprintfsprintf 的内部工作
【发布时间】:2012-06-07 11:14:21
【问题描述】:

我正在像这样使用 sprintf

sprintf(cTmpBuf, "%0*lu",targetPrecision,ulFraction);

在此之前我是这样使用的

sprintf(cTmpBuf, "%06lu", ulFraction); 

现在我知道它会选择 targetPrecision 的值并将其放入 * 但我想知道它背后发生的内部事情

【问题讨论】:

  • 你想知道它是如何实现的吗?
  • 两个电话在我看来都是一样的,除非我的眼睛在欺骗我?!!!
  • 对不起@RedSerpent 第二个是 sprintf(cTmpBuf, "%06lu", ulFraction);
  • @vivekgaur:不要添加评论;只需编辑您的问题。

标签: c++ c printf


【解决方案1】:

如果您想知道它是如何实现的,那就没有魔法了;这只是使用<stdarg.h> 处理的另一个参数。非常粗略,它会是这样的:

prec = -1;
⋮
if (*cp == '*') {
  prec = va_arg(ap, int);
  cp++;
}

【讨论】:

  • ap 取了我传递的值然后应用它?
  • 它做了我展示的。在看到* 时,函数决定将下一个参数解释为用于指定精度的整数。理解常规参数以完全相同的方式处理可能会有所帮助。例如,如果函数看到%g,它将执行类似double d = va_arg(ap, double); /* …format the double… */ 的操作。
【解决方案2】:

我不确定这是否能回答您的问题,但在字符串格式中使用 * 可以让您控制格式宽度。所以在第一次调用中,格式化宽度由targetPrecision 的值决定。

在第二次调用中,格式宽度固定为 6 位。

至于sprintf的实际内部结构。您可以参考@Marcelo Cantos 的回答。

查看link 获取格式化参数。

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2011-08-29
    • 2015-08-21
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多