原文地址:http://blog.csdn.net/chengyakun11/article/details/7657830
在Objective-C中,NSLog相当于C语言中的printf,常用于文字输出。
NSLog的定义
NSLog定义在NSObjCRuntime.h中,如下所示: void NSLog(NSString *format, …); 基本上,NSLog很像printf,同样会在console中输出显示结果。不同的是,传递进去的格式化字符是NSString的对象,而不是char *这种字符串指针。示例
NSLog可以如下面的方法使用: NSLog (@"this is a test"); NSLog (@"string is :%@", string); NSLog (@"x=%d, y=%d", 10, 20); 但是下面的写法是不行的: int i = 12345; NSLog( @"%@", i ); 原因是, %@需要显示对象,而int i明显不是一个对象,要想正确显示,要写成: int i = 12345; NSLog( @"%d", i );格式
NSLog的格式如下所示: %@ 对象%d, %i 整数%u 无符整形%f 浮点/双字%x, %X 二进制整数%o 八进制整数%zu size_t%p 指针%e 浮点/双字 (科学计算)%g 浮点/双字 %s C 字符串%.*s Pascal字符串%c 字符%C unichar%lld 64位长整数(long long)%llu 无符64位长整数%Lf 64位双字
NSLog/NSString 输出格式 Format String Issue
是不是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.
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 withCFTypeRef
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.
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
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.