OC中的格式说明符(Format Specifiers)

在 Objective-C 中,%@%d 这类符号是格式说明符,用于在 NSLog[NSString stringWithFormat:] 等方法中指定数据的输出格式。

📝 常用占位符速查表

占位符 类型说明 示例
%@ 对象 (调用对象的 description 方法) NSLog(@"%@", @"Hello");Hello
%d, %i 有符号整型 (int) NSLog(@"%d", 10);10
%ld 有符号长整型 (long) NSLog(@"%ld", (long)100);100
%lu 无符号长整型 (unsigned long) NSLog(@"%lu", (unsigned long)5);5
%f 浮点数 (double/float) NSLog(@"%f", 3.14);3.140000
%.2f 保留两位小数的浮点数 NSLog(@"%.2f", 3.14);3.14
%c 单个字符 (char) NSLog(@"%c", 'A');A
%s C语言字符串 (char*) NSLog(@"%s", "Hello");Hello
%% 百分号本身 NSLog(@"%%");%
%p 内存地址 NSLog(@"%p", &a);0x7ffee...

📏 修饰符(控制宽度与精度)

用法 说明 示例 (int num = 10) 输出结果
%4d 右对齐,占4个字符宽度 NSLog(@"%4d", num); 10
%-4d 左对齐,占4个字符宽度 NSLog(@"%-4d", num); 10
%04d 占4位,不足补0 NSLog(@"%04d", num); 0010
%.2f 保留两位小数 NSLog(@"%.2f", 3.14); 3.14

⚠️ 关键提醒

  1. %@ vs %s
    • %@ 用于 OC 对象(NSStringNSArray 等),调用的是对象的 description 方法。
    • %s 用于 C 风格字符串(char *),两者不能混用,否则会 crash 或乱码。
  2. NSInteger / NSUInteger 的打印 :最安全的写法是:
    • NSInteger%ld + (long) 强转
    • NSUInteger%lu + (unsigned long) 强转
  3. CGFloat 的打印 :直接使用 %f%.nf 即可。

使用场景示例

objectivec 复制代码
NSInteger age = 25;
CGFloat height = 175.5;
NSString *name = @"张三";
NSArray *array = @[@1, @2, @3];

// 组合使用
NSString *info = [NSString stringWithFormat:@"姓名:%@,年龄:%ld岁,身高:%.1fcm", name, (long)age, height];
NSLog(@"%@", info);  // 输出:姓名:张三,年龄:25岁,身高:175.5cm

// 打印数组
NSLog(@"数组内容:%@", array);  // 输出:数组内容:(
//    1,
//    2,
//    3
// )