C++中C/C++格式化输出

对于不同的机器,一此格式化输出的函数经常会得不到正确的输出,比方小端上的程序在大端上执行等,另外,在日常程序开发时,也会经常被这种小问题而困扰非常久。终于发现是她的问题。不免有点叹息,以下对printf/wprintf/CString.Format等相关函数所使用的格式化输出的语法作一总结。有些是从官方资料摘过来的,还是英文的。

函数中格式化声明的一般格式为:

%[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type

当中的每个蓝色项都代表了格式化输出格式中的一个选项。

这些输出格式选项一般使用一个字母或者一个数字来表示特定的格式。该格式说明语句最简单的形式就是百分号%加上一个类型说明符type。比如%s。假设%后跟的字符并不是type类型的选项之中的一个。那么这个字符将以文本的形式输出。

比如在输出百分号时所採用的语句%%。

出如今type之前的其它选项都分别控制了格式化输出的其它方面,详细例如以下:

type
该选项须要一个字符来确认要输出的參数是以字符的形式输出,还是以字符串的形式输出,或者仅仅是输出一个数字;具体參见本文附录1。
flags
它由一个或者若干个字符组成。它控制了输出的对齐方式、正负号、小数点、空白字符和十进制或者是十六进制的前缀等。

多个flag可同一时候出如今同一输出格式控制语句中。

width
一个数字;用来说明输出的最小位数。

precision
一个数字;用来说明所有输出字符的或者部分输出字符的最大位数。对于整型。该项限定了输出数字的最少个数。
h| l| ll| I| I32| I64
用来表示输出參数size的前缀(long/short, 32-/64-bit, single-byte字符/宽字符)。

具体參见本文附录2。

一种良好的编程习惯:
  在编敲代码的时候。不要在程序中出现类似于printf(name)的语句。

尽管该语句在C语言中输出name这个字符串,可是实际上这是非常危急的。假设name字符串中包括了“%s”,那么该语句将会在执行时失败。应该将该语句写为printf("%s",name);这种语句才是安全的。

附录1:类型说明符type

注意:类型说明符 C, n, p和S的行为, 还有c和s在printf函数中的行为,都是Microsoft的扩展,与ANSI标准不兼容。


character


Type


Output format


c


int orwint_t


用在printf函数中,表示的是一个single-byte字符。而用在wprintf函数中,表示的是一个宽字符。


C


int orwint_t


用在wprintf函数中,表示的是一个single-byte字符。而用在printf函数中,表示的是一个宽字符。(与c刚好相反)


d


int


有符号十进制整数  


i


int


有符号十进制整数


o


int


八进制无符号整数


u


int


无符号十进制整数


x


int


无符号十六进制整数,使用"abcdef"标识。


X


int


无符号十六进制整数。使用"ABCDEF"标识。


e


double


有符号值,输出形式为[ – ]d.dddd e [sign]dd[d]。

当中d是一个十进制的数字,其范围为0-9;dddd是一个或者多个十进制的数字。dd[d]是两个或者三个十进制的数字。其值依赖于输出的格式和指数的大小。

符号是+、-。


E


double


和e相似。仅仅是将输出中的e用E取代。


f


double


有符号值。输出形式为[-]dddd.dddd。小数点前面的数字由输出值的大小决定。而小数点后面的数字由输出的精度决定。


g


double


Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less
than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.


G


double


Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).


a


double


有符号双精度十六进制浮点数。输出形式为[?]0xh.hhhh p±dd。precision选项将决定小数点后面的位数。(using lower case letters)


A


double


有符号双精度十六进制浮点数。

输出形式为[?]0xh.hhhh P±dd。precision选项将决定小数点后面的位数。(using capital letters)


n


Pointer to integer


Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument. See Security Note below.


p


Pointer to void


以十六进制的形式输出地址


s


String


当和printf函数使用的时候。输出的是single-byte字符串。

而和wprintf使用的时候输出的是宽字符串;会依次输出全部字符知道遇到第一个null字符或者由precision值限定;


S


String


当和wprintf函数使用的时候。输出的是single-byte字符串。而和printf使用的时候输出的是宽字符串;会依次输出全部字符知道遇到第一个null字符或者由precision值限定;

Note:假设和%s或者%S相关的參数是一个null指针。将会输出“(null)”.

Note:在全部的指数格式中,默认的指数位数为3位;能够利用函数_set_output_format设定输出的位数为2。然后输出会依据须要扩展到3位。

Security Note: %n格式符是不安全的,在默认情况下是被禁用的;利用_set_printf_count_output函数能够启用该功能。

附录2

The optional prefixes to type, h, l, I, I32, I64, and ll specify
the "size" of argument (long or short, 32- or 64-bit, single-byte character or wide character, depending upon the type specifier that they modify). These type-specifier prefixes are used with type characters in printf functions
or wprintf functions to specify interpretation of arguments, as shown in the following table. These prefixes are Microsoft extensions and are not ANSI-compatible.

NOTE:

The h and l prefixes are Microsoft extensions when used with data of type char.


To specify


Use prefix


With type specifier


long int


l (lowercase L)


d, i, o, x, or X


long unsigned int


l


o, u, x, or X


long long


ll


d, i, o, x, or X


short int


h


d, i, o, x, or X


short unsigned int


h


o, u, x, or X


__int32


I32


d, i, o, x, or X


unsigned __int32


I32


o, u, x, or X


__int64


I64


d, i, o, x, or X


unsigned __int64


I64


o, u, x, or X


ptrdiff_t (that is, __int32 on 32-bit platforms, __int64 on 64-bit platforms)


I


d, i, o, x, or X


size_t (that is, unsigned __int32 on 32-bit platforms, unsigned __int64 on 64-bit platforms)


I


o, u, x, or X


long double


l or L


f


Single-byte character with printf functions


h


c or C


Single-byte character with wprintf functions


h


c or C


Wide character with printf functions


l


c or C


Wide character with wprintf functions


l


c or C


Single-byte – character string with printf functions


h


s or S


Single-byte – character string with wprintf functions


h


s or S


Wide-character string with printf functions


l


s or S


Wide-character string with wprintf functions


l


s or S


Wide character


w


c


Wide-character string


w


s

Thus to print single-byte or wide-characters with printf functions and wprintf functions, use format specifiers as follows.


To print character as


Use function


With format specifier


single byte


printf


c, hc, or hC


single byte


wprintf


C, hc, or hC


wide


wprintf


c, lc, lC, or wc


wide


printf


C, lc, lC, or wc

To print strings with printf functions and wprintf functions, use the prefixes h and l analogously with format type-specifiers s and S.

时间: 2024-10-12 21:21:33

C++中C/C++格式化输出的相关文章

python中神奇的格式化输出

python一共有两种格式化输出语法, 一种是类似于C语言printf的方式,称为 Formatting Expression >>> '%s %d-%d' % ('hello', 7, 1) 'hello 7-1' 另一种是类似于C#的方式,称为String Formatting Method Calls >>> '{0} {1}:{2}'.format('hello', '1', '7') 'hello 1:7' 第一种方式可以指定浮点数的精度,例如 >>

Python中日志的格式化输出

import logging logfile = 'e:\\a.txt' # logging.basicConfig(filename=logfile,level=logging.INFO) # logging.basicConfig(format='%(time.asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.basicConfig(level=logging.INFO, #format='%(asctime)s

18:再议python中的print——格式化输出

如果要在输出结果前面有个提示语句怎么办 18.1 十进制数值输出 %d表示十进制输出,%S表示要输出的变量,他们中间不能有逗号(,). 18.2 字符输出 68以16进制输出(%x)是什么? 68以8进制输出(%o)是什么? 68以2进制输出(%b)是什么? 68以字符输出(%c)是什么?

python_格式化输出%

在字符串中如若要格式化输出,则有如下方法,简单而又快捷. #coding=utf-8 #格式化输出 name = input("请输入您的姓名:") age = eval(input("请输入您的年龄:")) job = input("请输入您的工作:") like = input("请输入您的爱好:") msg = "-----His information------" "\nname : %

java中格式化输出

JAVA中有时候需要对计算出来的数据进行格式化,在java中使用printf可以达到目的. 格式化输出,每个以%字符开始的格式说明都用相应的参数替换,f表示浮点数,s表示字符串,d表示十进制整数,还可以加上标志符,详见下面的printf的标志. 下面先举一例: 1 public class testPrintf { 2 public static void main(String[] args){ 3 double number = 10000.0/3.0; 4 System.out.print

java中格式化输出大神Formatter简历

一.干嘛的?(作用) 在java中,所有新的格式化功能都有formatter类处理.可以将formatter看作一个翻译器,它将你的格式化字符串与数据翻译成需要的结果.比如很多地方格式输出都有用到,像我们在超市购物付款时候打印的购物小票啊,所以还是很实用的. 二.籍贯(所在库) java中的Formatter类位于java.util.Formatter中,所以需要用到的时候只要import进来就可以用了.注意,请选择1.5及以上版本的编译器,否则会出现"The method format(Str

python中格式化输出和字母大小写转换,对齐填充方式

#格式化输出print("ang is a good time")str7="ong is a boy"num=10f=5.22313# %d(整数站位符) %s(字符串站位符) %f(浮点数站位符)# %f默认小数点后6位,%.3f精确到小数点后3位.默认会四舍五入print("num=",num,"f=",f)print("num= %d,str7=%s,f=%.9f" %(num,str7,f))''

jstl中的sql:query标签获取的结果如何格式化输出

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*&q

python中while循环运算符及格式化输出

一,while循环 while 条件:       while语句块(循环体) 运行: 判断你给的条件是否为真,如果真则执行循环体.否则跳出循环. 执行完循环体之后再次判断条件是否为真 例子1 我们玩联盟的时候喷打野的的时候,可以用这种方式,这是一个死循环,条件为真,他会一直执行除非手动停止. while True: print("你是不是傻") print("出来帮一下可不可以") print("出来帮一下可不可以") print("