VC++格式化输入输出

10 篇文章 0 订阅

转自:http://www.cnblogs.com/cylee025/archive/2011/04/03/2004273.html

在本文中将讲述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, pS的行为, 还有 c和sprintf函数中的行为,都是Microsoft的扩展,与ANSI标准不兼容。

character

Type

Output format

c

int or wint_t

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

C

int or wint_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 dd。precision选项将决定小数点后面的位数。(using lower case letters)

A

double

有符号双精度十六进制浮点数。输出形式为[−]0xh.hhhh 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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值