标签归档:printf

RSS feed of printf

最后更新于 .

各位C、C++开发的朋友们,有没有想过小小的printf也会有陷阱呢?这篇文章,我们就深入来探究一下(代码均在suse10 32位系统下编译测试通过)。 废话不多说,直接上代码:

int64_t a = 1;
printf("%d\n", a); 

结果是多少呢?当然是1,你可能会说。 我们来看一下结果:

1

果然是1!但是你会不会以为是 a 首先被自动转化成了 int 类型,然后输入为 1的呢? 如果真这么简单,本文到此也该结束了。我们换一个写法:

int64_t a = 1;
int b = 2;
printf("%d, %d\n", a, b);

这次的结果是多少呢?1 和 2?真的吗?我们来看一下结果:

1, 0 ...

最后更新于 .

(1)输出格式控制综述:
    printf的格式控制的完整格式:%  -  0  m.n  l或h
    ①%:格式说明的起始符号,不可缺少。
    ②-: 有-表示左对齐输出,如省略表示右对齐输出。
    ③0:有0表示指定空位填0,如省略表示指定空位不填。
    ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。未指定n时,隐含的精度为n=6位。
    ⑤l或h:l对整型指long型,对实型指double型。
          h用于将整型的格式字符修正为short型。

(2)输出项数据类型控制综述:
    ①d格式:用来输出十进制整数。有以下几种用法:
       %d:按整型数据的实际长度输出。
     %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若   大于m,则按实际位数输出。
       %ld:输出长整型数据。
    ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。
    ③x格式:以无符号十六进制形式输出整数 ...

最后更新于 .

自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:

int snprintf(char *str, size_t size, const char *format, …);

但是大家在使用snprintf的时候是否真的清楚参数里size的意思呢?看下面的例子:
假设我想将一个char类型的变量打印成2进制,我应该怎么写呢?

之前有个同事这样写的:

char a=‘a’;
char str[20];
snprintf(str,2,“%02x”,a);

对不对呢,错了。
1.2不应该是2,应该是3.
2.也不建议直接写3,应该写sizeof(str)

所以建议的写法是:

char a=‘a’;
char str[3];//再大点也没有问题
snprintf(str,sizeof(str),“%02x”,a);

解释如下:
size是限定最终生成的dest的字符数,最多拷贝size-1个字符; 一般情况下size会取sizeof ...