【问题标题】:How does snprintf alignment bytessnprintf 如何对齐字节
【发布时间】:2017-11-05 04:28:04
【问题描述】:

根据here 的回答,我想看看 snprintf 使用了多少字节。以下代码

#include "stdio.h"

int main() {
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:%llx", 0, 0, 0, 0, 0, 0));
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:", 0, 0, 0, 0, 0));
    printf("%d\n", snprintf(NULL, 0, "%llx", 0));
    return 0;
}

返回

22
10
1

我不明白打印的其他数据末尾的 %llx 如何使用 12 个字节,而如果单独使用它只使用 1 个字节。 snprintf 是否进行任何字节对齐?

【问题讨论】:

  • @Stargateur UB 是美国。
  • @DavidSchwartz 确实,没关系,我总是忘记 C 不会在可变参数函数中推断类型。
  • 未定义的行为,schmundefined schmehaviour。

标签: c int printf


【解决方案1】:

您的代码有错误。 %llx 格式说明符仅适用于 long longs。试试:

#include "stdio.h"

int main() {
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:%llx", 0, 0LL, 0LL, 0LL, 0LL, 0LL));
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:", 0, 0LL, 0LL, 0LL, 0LL));
    printf("%d\n", snprintf(NULL, 0, "%llx", 0LL));
    return 0;
}

【讨论】:

  • 技术上是unsigned long long,所以应该是0ull
  • 如果没有ull,C怎么编译呢?它认为这是一个未定义的代码吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多