热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么在printf格式字符串中使用%8.8而不是%08?

如何解决《为什么在printf格式字符串中使用%8.8而不是%08?》经验,为你挑选了3个好方法。

刚刚遇到一些(非常)遗留代码(最初编写为C但现在编译为C++)并使用宽度说明符将零填充字符串

void main()
{
    unsigned long val = 2413;
    printf("V1: %08lu \n", val);
    printf("V2: %8.8lu \n", val);
}

结果是一样的

V1: 00002413
V2: 00002413

那么为什么要使用V2呢?从昔日开始,它是std lib的遗留方面吗?

编译器详细信息:用于x86的Microsoft(R)C/C++优化编译器版本19.10.25019



1> AnT..:

对于无符号整数类型,没有区别.对于有符号整数类型的负值,您将看到不同的输出

long val = -2413;
printf("V1: %08ld\n", val);
printf("V2: %8.8ld\n", val);

V1: -0002413
V2: -00002413

.8部分%8.8ld指定显示的最小数字位数.并且该-标志不被视为数字.因此,第二个版本需要始终打印8位数.如果值为负,则-符号将别无选择,只能成为打印的第9个字符,因此违反了请求的字段宽度8.

%08ld版本不需要打印至少8位数,这就是为什么-符号占据字段宽度8 的一个字符,并且只打印7位数字.

http://coliru.stacked-crooked.com/a/fc9022cc0ef3e097


@gsamaras:是的.`.8`部分指定*出现的最小位数*.这意味着您将始终看到8位数字.`-`不计算在内.这允许它突破8个字符字段.在第一个版本中没有"最低"要求,这就是为什么`-`吃掉一个空格并导致输出的数字减少.

2> Jonathan Lef..:

正如我在评论中所指出的,对于字符串,%8s和之间存在差异%8.8s- 如果字符串长于,则后者会截断8.还有另一个不同之处; 0不是有效的修饰符%s.与... %8.8lu没有什么不同%.8lu; %.8lu和之间没有太大区别%08lu,虽然0年龄较大,但是.被添加到了C90(这些日子已经很老了).但是,当值为负时,%.8ld和之间存在差异%08ld.

下面是一些代码,用于说明有printf()符号和无符号值的整数格式的一些变幻莫测.请注意,如果你有(%8.6lu而不是%8.8lu签名),你会得到有趣的差异.

#include 

static void test_ul(void)
{
    char *fmt[] =
    {
        "%08lu",
        "%8.8lu",
        "%.8lu",
        "%8.6lu",
        "%6.8lu",
    };
    enum { NUM_FMT = sizeof(fmt) / sizeof(fmt[0]) };
    unsigned long val[] = { 2413LU, 234512349LU };
    enum { NUM_VAL = sizeof(val) / sizeof(val[0]) };
    for (int i = 0; i 

输出(macOS Sierra 10.12.5上的GCC 7.1.0):

   %08lu: [00002413]
   %08lu: [234512349]
  %8.8lu: [00002413]
  %8.8lu: [234512349]
   %.8lu: [00002413]
   %.8lu: [234512349]
  %8.6lu: [  002413]
  %8.6lu: [234512349]
  %6.8lu: [00002413]
  %6.8lu: [234512349]
   %08ld: [00002413]
   %08ld: [-0002413]
   %08ld: [234512349]
   %08ld: [-234512349]
  %8.8ld: [00002413]
  %8.8ld: [-00002413]
  %8.8ld: [234512349]
  %8.8ld: [-234512349]
   %.8ld: [00002413]
   %.8ld: [-00002413]
   %.8ld: [234512349]
   %.8ld: [-234512349]
  %8.6ld: [  002413]
  %8.6ld: [ -002413]
  %8.6ld: [234512349]
  %8.6ld: [-234512349]
  %6.8ld: [00002413]
  %6.8ld: [-00002413]
  %6.8ld: [234512349]
  %6.8ld: [-234512349]



3> gsamaras..:

unsigned long你在ref中读到时,这两个在与(/整数)一起使用时是等价的.

printf("V1: %08lu \n", val);

0 当指定填充时,flag将使用零(0)而不是空格填充数字(请参阅width子说明符).

8将是number"要打印的最小字符数.如果要打印的值小于此数字,则结果将填充空格.即使结果较大,也不会截断该值."


现在这个:

printf("V2: %8.8lu \n", val);

将保持8as 的效果number,但将添加.8,如.number"对于整数说明符(d,i,o,u,x,X):precision指定要写入的最小位数.如果要写入的值更短比这个数字,结果用前导零填充.即使结果更长,该值也不会被截断.精度为0意味着没有为值0写入字符."


PS:标准C++应该发出诊断错误:

prog.cc:3:11: error: '::main' must return 'int'
 void main()
           ^

然而,即使是Stroustrup本人也说这"不是也不是C++,甚至也不是C".


推荐阅读
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • linux 字符串数组初始化,C++字符数组初始化方法的分析
    发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,分析介绍如下:往往我们在初始化一个字符数组,大概有如下几 ... [详细]
  • VS用c语言连接mysql,c语言连接mysql完整演示
    #include#includeintmain(){MYSQL*conn;创建一个指向mysql数据类型的指针connmysql_init(NULL);mysql的初始化if(!c ... [详细]
  • 1.      准备工作: 程序:MinGW-3.1.0-1.exe     windows下的gcc,编译c语言的工具下载地址: http:umn.dl.sourceforge. ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 第四讲ApacheLAMP服务器基本配置Apache的编译安装从Apache的官方网站下载源码包:http:httpd.apache.orgdownload.cgi今 ... [详细]
  • Igotthiscode(IknowitsinSpanishIcantranslateifneeded)wheretheygivemethefunctionS ... [详细]
  • 如何用Vscode和 Visual stdudio配置C++环境
    这篇文章主要讲解了“如何用Vscode和Visualstdudio配置C++环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深 ... [详细]
author-avatar
大东o世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有