代码之家  ›  专栏  ›  技术社区  ›  ta.speot.is

打印字符串

  •  27
  • ta.speot.is  · 技术社区  · 16 年前

    在Objective-C中打印NSString的正确方法是什么?许多示例使用NSLog(),但根据文档:

    NSLog是一个FoundationKit函数,用于将调试语句打印到控制台。 NSLog的工作原理基本上如下: fprintf(标准格式、格式字符串、参数…);

    对我来说,这有点像Win32/C++中的_TRACE宏。我不想打印到stderr,我想打印到stdout。有人建议使用printf()如下:

    printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]);
    

    但这看起来像是间接打印NSString的额外级别,而且“感觉”不像解决方案。

    6 回复  |  直到 16 年前
        1
  •  26
  •   kennytm    16 年前

    解决方案。

    自从 printf 是纯C函数,它不会识别Objective-C对象(NSLog的格式化程序不同于printf的格式化程序。)因此,在格式化之前必须将其转换为C字符串。

    [str UTF8String] [str cStringUsingEncoding:NSUTF8StringEncoding]

        2
  •  29
  •   Steven Fisher    11 年前

    向…喷东西 stdout stdout .

    但是,基金会确实提供了对STDUT进行写入的方法。明确地 NSFileHandle fileHandleWithStandardOutput 它提供了一个可以写入的文件句柄 stdout .

    NSString NSData 然后写下来。

    相当多的步骤,但很容易包装在一个可重用的函数中:

    void MyLog(NSString *format, ...) {
        va_list args;
        va_start(args, format);
        NSString *formattedString = [[NSString alloc] initWithFormat: format
                                                      arguments: args];
        va_end(args);
        [[NSFileHandle fileHandleWithStandardOutput]
            writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding]];
        [formattedString release];
    }
    
        3
  •  6
  •   Jayce    9 年前

    C字符串(UTF8String)是指向字符串对象内部结构的指针。

    NSString *str = @"Hello, World.";
    printf("%s\n", [str UTF8String]);
    
        4
  •  4
  •   svth    9 年前

    // print to stdout
    static void NSPrint(NSString *format, ...) {
        va_list args;
        va_start(args, format);
    
        NSString *string = [[NSString alloc] initWithFormat:format arguments:args];
    
        va_end(args);
    
        fprintf(stdout, "%s\n", [string UTF8String]);
    
    #if !__has_feature(objc_arc)
        [string release];
    #endif
    }
    
    // print to stderr
    static void NSPrintErr(NSString *format, ...) {
        va_list args;
        va_start(args, format);
    
        NSString *string = [[NSString alloc] initWithFormat:format arguments:args];
    
        va_end(args);
    
        fprintf(stderr, "%s\n", [string UTF8String]);
    
    #if !__has_feature(objc_arc)
        [string release];
    #endif
    }
    
        5
  •  3
  •   Eimantas    16 年前

    您应该使用自定义文件处理程序或自己编写宏。

    提示:当NSLog打印出一个对象时,它使用对象的 debugDescription 方法。您可以为自定义设置重写此方法 NSObject 将自定义调试信息打印到标准输出的子类。

        6
  •  0
  •   LavaSlider    9 年前

    define NSPrintf(...)   printf( "%s", [[NSString stringWithFormat: __VA_ARGS__] UTF8String] )
    

    NSPrintf( @"Sorry %@, I can't do that\n", name );