您的位置:首页 > 产品设计 > UI/UE

NSLog/NSString 输出格式 Format String Issue

2011-09-23 22:34 295 查看

是不是Xcode总是报告NSLog格式输出不对?

Yes,

warning: Format String Issue: Conversion specifies type 'int' but the argument has type 'long'

String Format Specifiers

This article summarizes the format specifiers supported by string formatting methods and functions.

Format Specifiers

The format specifiers supported by the
NSString
formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you can also use the “
n$
” positional specifiers such as
%1$@ %2$s
. For more details, see the IEEE printf specification. You can also use these format specifiers with the
NSLog
function.

Table 1 Format specifiers supported by the
NSString
formatting methods and CFString formatting functions

Specifier

Description

%@


Objective-C object, printed as the string returned by
descriptionWithLocale:
if available, or
description
otherwise. Also works with
CFTypeRef
objects, returning the result of the
CFCopyDescription
function.

%%


'%'
character

%d
,
%D
,
%i


Signed 32-bit integer (
int
)

%u
,
%U


Unsigned 32-bit integer (
unsigned int
)

%hi


Signed 16-bit integer (
short
)

%hu


Unsigned 16-bit integer (
unsigned short
)

%qi


Signed 64-bit integer (
long long
)

%qu


Unsigned 64-bit integer (
unsigned long long
)

%x


Unsigned 32-bit integer (
unsigned int
), printed in hexadecimal using the digits 0–9 and lowercase a–f

%X


Unsigned 32-bit integer (
unsigned int
), printed in hexadecimal using the digits 0–9 and uppercase A–F

%qx


Unsigned 64-bit integer (
unsigned long long
), printed in hexadecimal using the digits 0–9 and lowercase a–f

%qX


Unsigned 64-bit integer (
unsigned long long
), printed in hexadecimal using the digits 0–9 and uppercase A–F

%o
,
%O


Unsigned 32-bit integer (
unsigned int
), printed in octal

%f


64-bit floating-point number (
double
)

%e


64-bit floating-point number (
double
), printed in scientific notation using a lowercase e to introduce the exponent

%E


64-bit floating-point number (
double
), printed in scientific notation using an uppercase E to introduce the exponent

%g


64-bit floating-point number (
double
), printed in the style of
%e
if the exponent is less than –4 or greater than or equal to the precision, in the style of
%f
otherwise

%G


64-bit floating-point number (
double
), printed in the style of
%E
if the exponent is less than –4 or greater than or equal to the precision, in the style of
%f
otherwise

%c


8-bit unsigned character (
unsigned char
), printed by
NSLog()
as an ASCII character, or, if not an ASCII character, in the octal format
\\ddd
or the Unicode hexadecimal format
\\udddd
, where
d
is a digit

%C


16-bit Unicode character (
unichar
), printed by
NSLog()
as an ASCII character, or, if not an ASCII character, in the octal format
\\ddd
or the Unicode hexadecimal format
\\udddd
, where
d
is a digit

%s


Null-terminated array of 8-bit unsigned characters.
%s
interprets its input in the system encoding rather than, for example, UTF-8.

%S


Null-terminated array of 16-bit Unicode characters

%p


Void pointer (
void *
), printed in hexadecimal with the digits 0–9 and lowercase a–f, with a leading
0x


%L


Length modifier specifying that a following
a
,
A
,
e
,
E
,
f
,
F
,
g
, or
G
conversion specifier applies to a
long double
argument

%a


64-bit floating-point number (
double
), printed in scientific notation with a leading
0x
and one hexadecimal digit before the decimal point using a lowercase
p
to introduce the exponent

%A


64-bit floating-point number (
double
), printed in scientific notation with a leading
0X
and one hexadecimal digit before the decimal point using a uppercase
P
to introduce the exponent

%F


64-bit floating-point number (
double
), printed in decimal notation

%z


Length modifier specifying that a following
d
,
i
,
o
,
u
,
x
, or
X
conversion specifier applies to a
size_t
or the corresponding signed integer type argument

%t


Length modifier specifying that a following
d
,
i
,
o
,
u
,
x
, or
X
conversion specifier applies to a
ptrdiff_t
or the corresponding unsigned integer type argument

%j


Length modifier specifying that a following
d
,
i
,
o
,
u
,
x
, or
X
conversion specifier applies to a
intmax_t
or
uintmax_t
argument

Platform Dependencies

Mac OS X uses several data types—
NSInteger
,
NSUInteger
,
CGFloat
, and
CFIndex
—to provide a consistent means of representing values in 32- and 64-bit environments. In a 32-bit environment,
NSInteger
and
NSUInteger
are defined as
int
and
unsigned int
, respectively. In 64-bit environments,
NSInteger
and
NSUInteger
are defined as
long
and
unsigned long
, respectively. To avoid the need to use different printf-style type specifiers depending on the platform, you can use the specifiers shown in Table 2. Note that in some cases you may have to cast the value.

Table 2 Format specifiers for data types

Type

Format specifier

Considerations

NSInteger


%ld
or
%lx


Cast the value to
long


NSUInteger


%lu
or
%lx


Cast the value to
unsigned long


CGFloat


%f
or
%g


%f
works for floats and doubles when formatting; but see below warning when scanning

CFIndex


%ld
or
%lx


The same as
NSInteger


pointer

%p


%p
adds
0x
to the beginning of the output. If you don't want that, use
%lx
and cast to
long
.

long long


%lld
or
%llx


long long
is 64-bit on both 32- and 64-bit platforms

unsigned long long


%llu
or
%llx


unsigned long long
is 64-bit on both 32- and 64-bit platforms

The following example illustrates the use of
%ld
to format an
NSInteger
and the use of a cast.

NSInteger i = 42;

printf("%ld\n", (long)i);

In addition to the considerations mentioned in Table 2, there is one extra case with scanning: you must distinguish the types for
float
and
double
. You should use
%f
for float,
%lf
for double. If you need to use
scanf
(or a variant thereof) with
CGFloat
, switch to
double
instead, and copy the
double
to
CGFloat
.

CGFloat imageWidth;

double tmp;

sscanf (str, "%lf", &tmp);

imageWidth = tmp;

It is important to remember that
%lf
does not represent
CGFloat
correctly on either 32- or 64-bit platforms. This is unlike
%ld
, which works for
long
in all cases.

%@ Object
%d, %i signed int
%u unsigned int
%f float/double
%x, %X hexadecimal int
%o octal int
%zu size_t
%p pointer
%e float/double (in scientific notation)
%g float/double (as %f or %e, depending on value)
%s C string (bytes)
%S C string (unichar)
%.*s Pascal string (requires two arguments, pass pstr[0] as the first, pstr+1 as the second)
%c character
%C unichar

%lld long long
%llu unsigned long long
%Lf long double
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: