相关疑难解决方法(0)

uint32_t和size_t的printf格式说明符

我有以下内容

size_t   i = 0;
uint32_t k = 0;

printf("i [ %lu ] k [ %u ]\n", i, k);
Run Code Online (Sandbox Code Playgroud)

编译时我收到以下警告:

format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
Run Code Online (Sandbox Code Playgroud)

当我使用夹板运行时,我得到以下内容:

Format argument 1 to printf (%u) expects unsigned int gets size_t: k
Run Code Online (Sandbox Code Playgroud)

非常感谢任何建议,

c printf

96
推荐指数
4
解决办法
19万
查看次数

如何使用gcc打印__uint128_t数字?

PRIu128,其行为类似于PRIu64来自<inttypes.h>:

printf("%" PRIu64 "\n", some_uint64_value);
Run Code Online (Sandbox Code Playgroud)

或者手动逐位转换:

int print_uint128(uint128_t n) {
  if (n == 0)  return printf("0\n");

  char str[40] = {0}; // log10(1 << 128) + '\0'
  char *s = str + sizeof(str) - 1; // start at the end
  while (n != 0) {
    if (s == str) return -1; // never happens

    *--s = "0123456789"[n % 10]; // save last digit
    n /= 10;                     // drop it
  }
  return printf("%s\n", s);
}
Run Code Online (Sandbox Code Playgroud)

是唯一的选择吗? …

c gcc

45
推荐指数
3
解决办法
5万
查看次数

使用printf打印clock_t的正确方法是什么?

我目前正在使用显式强制转换unsigned long long并使用%llu它来打印它,但既然size_t有说明%z符,为什么没有clock_t

甚至没有宏观.也许我可以假设在x64系统(操作系统和CPU)size_t上长度为8个字节(即使在这种情况下,他们已提供%z),但是呢clock_t

c io printf clock

29
推荐指数
3
解决办法
6万
查看次数

printof with sizeof on 32 vs 64 platform:如何以独立于平台的方式处理格式代码?

我有一些代码打印程序使用的内存量.该行类似于:

printf("The about of RAM used is %u", anIntVariable*sizeof(double) );
Run Code Online (Sandbox Code Playgroud)

其中anIntVariable是double数组元素数的int变量.无论如何,在32位系统上我从来没有遇到任何问题,但在64位系统上,我得到一个编译器警告关于使用"%u"作为无符号长整数.使用"%lu"作为格式代码可以解决64位问题,但会导致编译器抱怨32位,因为类型返回unsigned int.我发现,确实,sizeof(double)在32位与64位系统上返回不同的值.我找到了一些网页指南,用于代码从32位转换为64位但是我宁愿让代码同时适用于两者而不仅仅是来回转换.

如何以独立于平台的方式编写此行?我知道很多方法可以使用预处理器指令来实现它,但这似乎是一个黑客攻击.当然有一种我没有意识到的优雅方式.

c 32bit-64bit

29
推荐指数
3
解决办法
1万
查看次数

如何打印像ino_t这样的未知大小的类型?

我经常会遇到我想要printf使用整数类型的实现定义大小(如ino_ttime_t)的值进行打印的情况.现在,我使用这样的模式:

#include <inttypes.h>

ino_t ino; /* variable of unknown size */
printf("%" PRIuMAX, (uintmax_t)ino);
Run Code Online (Sandbox Code Playgroud)

这种方法到目前为止有效,但它有一些缺点:

  • 我必须知道我正在尝试打印的类型是签名还是未签名.
  • 我必须使用可能会扩大我的代码的类型转换.

有更好的策略吗?

c printf portability

23
推荐指数
3
解决办法
7785
查看次数

如何在C中打印'off_t'?

可能重复:
我应该如何打印off_t和size_t等类型?

我正在使用fstat(stream, &fs)C中的文件大小返回类型off_t.

打印这个只是一个警告:

format ‘%d’ expects type ‘int’, but argument has type ‘off_t’
Run Code Online (Sandbox Code Playgroud)

任何想法如何打印这没有编译器错误?

c printf

3
推荐指数
1
解决办法
2万
查看次数

如何在ANSI C(C89)中使用printf打印size_t和ptrdiff_t

我知道在SO上已经多次受到质疑,但我的问题是ANSI C(C89)特有的.

在C99有子符zt,其未在ANSI下支持

使用说明p符怎么样?

c printf c89

2
推荐指数
1
解决办法
1363
查看次数

C:找出没有 gcc 警告的 typedef 的 % 格式说明符?

typedef在 C 中尝试使用'd 变量时遇到的问题之一是弄清楚实际的原始类型是什么,typedef以便%在尝试使用printf. 大多数时候我不得不参考gcc. 例如,使用时,stat系统调用,返回的结构有很多不同成员的typedef“d类型的喜欢dev_tino_tmode_t,等,我通常去猜测什么样的格式说明可能是然后编译器警告我,我更正:

stat_demo.c: In function ‘main’:
stat_demo.c:46:45: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘__blksize_t’ {aka ‘long int’} [-Wformat=]
   46 |     printf("block size for file system IO: %d\n", s->st_blksize);
      |                                            ~^     ~~~~~~~~~~~~~
      |                                             |      |
      |                                             int    __blksize_t {aka long int}
      |                                            %ld
Run Code Online (Sandbox Code Playgroud)

这是大多数人在打印 typedef 时使用它们的方式吗?这难道不是因为你需要知道真正的原始生命typedef是什么吗?有没有更好的方法来完全抽象实际类型?

c typedef

2
推荐指数
1
解决办法
68
查看次数

标签 统计

c ×8

printf ×5

32bit-64bit ×1

c89 ×1

clock ×1

gcc ×1

io ×1

portability ×1

typedef ×1