Yes,
warning: Format String Issue: Conversion specifies type 'int' but the argument has type 'long'
This article summarizes the format specifiers supported by string formatting methods and functions.
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.
Specifier |
Description |
---|---|
|
Objective-C object, printed as the string returned by |
|
|
|
Signed 32-bit integer ( |
|
Unsigned 32-bit integer ( |
|
Signed 16-bit integer ( |
|
Unsigned 16-bit integer ( |
|
Signed 64-bit integer ( |
|
Unsigned 64-bit integer ( |
|
Unsigned 32-bit integer ( |
|
Unsigned 32-bit integer ( |
|
Unsigned 64-bit integer ( |
|
Unsigned 64-bit integer ( |
|
Unsigned 32-bit integer ( |
|
64-bit floating-point number ( |
|
64-bit floating-point number ( |
|
64-bit floating-point number ( |
|
64-bit floating-point number ( |
|
64-bit floating-point number ( |
|
8-bit unsigned character ( |
|
16-bit Unicode character ( |
|
Null-terminated array of 8-bit unsigned characters. |
|
Null-terminated array of 16-bit Unicode characters |
|
Void pointer ( |
|
Length modifier specifying that a following |
|
64-bit floating-point number ( |
|
64-bit floating-point number ( |
|
64-bit floating-point number ( |
|
Length modifier specifying that a following |
|
Length modifier specifying that a following |
|
Length modifier specifying that a following |
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.
Type |
Format specifier |
Considerations |
---|---|---|
|
|
Cast the value to |
|
|
Cast the value to |
|
|
|
|
|
The same as |
pointer |
|
|
|
|
|
|
|
|
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
toCGFloat
.
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
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。