componentsSeparatedByCharactersInSet给了我一堆空字符串

时间:2010-10-07 17:17:12

标签: objective-c

好的,首先,我使用GNUStep作为学习Objective-C的一种方式,因此GNU和Apple实现之间可能存在一些差异。话虽如此,它不应该影响我的问题。

无论如何,要了解我的难题,请将以下代码解析到您的视觉容器中:

#import <Cocoa/Cocoa.h>
int main()
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  NSEnumerator * LineEnumerator = [[NSArray arrayWithObjects: @"Jim     1", @"Steve   3", nil] objectEnumerator];
  NSString * s;
  while((s = [LineEnumerator nextObject]))
  {
    NSArray * parts = [s componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSLog(@"%@", parts);
  }
  [pool drain];
  return NO;
}

以下输出:

2010-10-07 10:03:50.809 a.out[24512] (Jim, "", "", "", "", 1)
2010-10-07 10:03:50.812 a.out[24512] (Steve, "", "", 3)

我的预期输出是:

2010-10-07 10:03:50.809 a.out[24512] (Jim, 1)
2010-10-07 10:03:50.812 a.out[24512] (Steve, 3)

但componentsSeparatedByCharactersInSet似乎是唯一接近我正在寻找的方法(顺便说一句,我想为任何空格,制表符或其他空白字符的混合做好准备)。有没有一种简单的方法可以使用标准库而无需编写新方法?

2 个答案:

答案 0 :(得分:5)

我认为你必须使用NSScanner:

while((s = [LineEnumerator nextObject]))
{
    NSMutableArray *parts = [[NSMutableArray alloc] initWithCapacity:1];

    NSScanner *scanner = [NSScanner scannerWithString:s];
    NSString *token;
    while ([scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] intoString:&token]) {
        [parts addObject:token];
    }

    NSLog(@"%@", parts);
    [parts release];
}   

答案 1 :(得分:-1)

如果你没有换行,为什么不直接使用[NSCharacterSet whitespaceCharacterSet]呢?