C++ 字符串的格式化(转)

作者在 2014-01-28 00:45:15 发布以下内容

C++格式化字符串(续)

2. 一些特殊规定字符

━━━━━━━━━━━━━━━━━━━━━━━━━━ 

   字符                          作用

──────────────────────────

    \n                  换行

    \f                  清屏并换页

    \r                  回车

    \t                  Tab符

    \xhh                表示一个ASCII码用16进表示, 其中hh是1到2个16进制数

━━━━━━━━━━━━━━━━━━━━━━━━━━ 

 

        char c, s[20], *p; 

         int a=1234, *i; 

         float f=3.141592653589; 

         double x=0.12345678987654321; 

         p="How do you do"; 

         strcpy(s, "Hello, Comrade"); 

         *i=12; 

         c='\x41'; 

         printf("a=%d\n", a);     /*结果输出十进制整数a=1234*/ 

         printf("a=%6d\n", a);    /*结果输出6位十进制数a=  1234*/ 

         printf("a=%06d\n", a);   /*结果输出6位十进制数a=001234*/ 

         printf("a=%2d\n", a);    /*a超过2位, 按实际值输出a=1234*/ 

         printf("*i=%4d\n", *i);  /*输出4位十进制整数*i=  12*/ 

         printf("*i=%-4d\n", *i); /*输出左对齐4位十进制整数*i=12*/ 

         printf("i=%p\n", i);     /*输出地址i=06E4*/ 

         printf("f=%f\n", f);     /*输出浮点数f=3.141593*/ 

         printf("f=6.4f\n", f);   /*输出6位其中小数点后4位的浮点数f=3.1416*/ 

         printf("x=%lf\n", x);    /*输出长浮点数x=0.123457*/ 

         printf("x=%18.16lf\n", x);/*输出18位其中小数点后16位的长浮点数x=0.1234567898765432*/

         printf("c=%c\n", c);     /*输出字符c=A*/ 

         printf("c=%x\n", c);     /*输出字符的ASCII码值c=41*/ 

         printf("s[]=%s\n", s);   /*输出数组字符串s[]=Hello,Comrade*/ 

         printf("s[]=%6.9s\n", s);/*输出最多9个字符的字符串s[]=Hello,Co*/ 

         printf("s=%p\n", s);     /*输出数组字符串首字符地址s=FFBE*/ 

         printf("*p=%s\n", p);    /* 输出指针字符串p=How do you do*/ 

         printf("p=%p\n", p);     /*输出指针的值p=0194*/ 

 

   上面结果中的地址值在不同计算机上可能不同。

printf和sprintf 都使用C++格式化字符串来指定串的格式,在格式串内部使用一些以"%"开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

sprintf最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf在大多数场合可以替代itoa。

如:

1.  //把整数123 打印成一个字符串保存在s 中。  

2.  sprintf(s, "%d", 123); //产生"123"可以指定宽度,不足的左边补空格:  

3.  sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"当然也可以左对齐:  

4.  sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"  

也可以按照16 进制打印:
 

1.  sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐  

2.  sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐 

这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。

1.  sprintf(s, "%08X", 4567); //产生:"000011D7" 

上面以"%d"进行的10 进制打印同样也可以使用这种左边补0 的方式。

这里要注意一个符号扩展的问题:比如,假如我们想打印短整数(short)-1 的内存16 进制表示形式,在Win32 平台上,一个short 型占2个字节,所以我们自然希望用4 个16 进制数字来打印它:

1.  short si = -1; 

2.  sprintf(s, "%04X", si); 

产 生"FFFFFFFF",怎么回事?因为spritnf 是个变参函数,除了前面两个参数之外,后面的参数都不是类型安全的,函数更没有办法仅仅通过一个"%X"就能得知当初函数调用前参数压栈时被压进来的到底 是个4 字节的整数还是个2 字节的短整数,所以采取了统一4 字节的处理方式,导致参数压栈时做了符号扩展,扩展成了32 位的整数-1,打印时4 个位置不够了,就把32 位整数-1 的8 位16 进制都打印出来了。

如果你想看si 的本来面目,那么就应该让编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不是补符号位):

1.  sprintf(s, "%04X", (unsigned short)si); 

就可以了。或者:

1.  unsigned short si = -1;  

2.  sprintf(s, "%04X", si);  

sprintf和printf 还可以按8 进制打印整数字符串,使用"%o"。注意8 进制和16 进制都不会打印出负数,都是无符号的,实际上也就是变量的内部编码的直接的16 进制或8 进制表示。

C++格式化字符串的具体应用方法就为大家介绍到这里。


C++ | 阅读 8880 次
文章评论,共0条
游客请输入验证码