• 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.

    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 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 aAeEfFg, 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 dioux, or X conversion specifier applies to a size_t or the corresponding signed integer type argument

    %t

    Length modifier specifying that a following dioux, or X conversion specifier applies to a ptrdiff_t or the corresponding unsigned integer type argument

    %j

    Length modifier specifying that a following dioux, or X conversion specifier applies to a intmax_t or uintmax_t argument

    Platform Dependencies

    Mac OS X uses several data types—NSIntegerNSUInteger,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, NSIntegerand 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 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

    aliyun活动 https://www.aliyun.com/acts/limit-buy?userCode=re2o7acl
  • 相关阅读:
    dropload.js 上滑加载,下拉刷新
    jQuery支持图片放大缩小查看效果
    iScroll-5 API 中文版
    多行文字垂直居中
    jQuery延迟加载(懒加载)插件 – jquery.lazyload.js
    js生成中文二维码
    JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??
    HTML5页面,用JS 禁止弹出手机键盘
    watch和computed的用法区别是什么?
    JS中的call()和apply()
  • 原文地址:https://www.cnblogs.com/wangbin/p/2186742.html
Copyright © 2020-2023  润新知