好的,首先,我使用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似乎是唯一接近我正在寻找的方法(顺便说一句,我想为任何空格,制表符或其他空白字符的混合做好准备)。有没有一种简单的方法可以使用标准库而无需编写新方法?
答案 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]呢?