NSScanner scanCharactersFromSet找不到前导选项卡



一个简单的例程,使用NSScanner查找前导选项卡的数量,但它没有找到任何选项卡。代码转到scanCharactersFromSet语句的"else"。我尝试将asciiTabRange.location更改为0x49(ASCII"I"),并将输入字符串更改为以"I"开头,而不是以制表符开头,它会找到一个前导"I",因此问题似乎特定于前导制表符。lldb输出显示字符串以一个tab开头,[asciiTab characterIsMember]语句返回YES。

{
self = [super init];
if (self) {
    if ([recordString length] != 0) {
        NSScanner* theScanner = [NSScanner scannerWithString: recordString];
        NSString* testConfirmString = [theScanner string];
        const char* testConfirmCStr = [testConfirmString cStringUsingEncoding: NSASCIIStringEncoding];
        if (testConfirmCStr != NULL);
        NSRange asciiTabRange;
        asciiTabRange.location = 0x09;
        asciiTabRange.length   = 1;
        NSCharacterSet* asciiTab = [NSCharacterSet characterSetWithRange: asciiTabRange];
        if ([asciiTab characterIsMember: 0x09] == YES) {
            testConfirmCStr = 0;
        }
        NSString*  tabString = nil;
        if ([theScanner scanCharactersFromSet: asciiTab
                                   intoString: &tabString] == YES) {
            tabLevel = [tabString length];
        } else {
            tabLevel = 0;
        }
        itemText = [recordString substringFromIndex: tabLevel];
    } else {
        // ?
    }
    children = [[NSMutableArray alloc] init];
}
return self;

}

(lldb)x-c 32 testConfirmCStr0x600000043a91:09 49 6e 64 75 73 74 72 79 3a 09 54 65 73 74 53.行业:.TestS0x600000043aa1:65 76 65 72 61 6c 00 00 00 00 000 00 00 00 0 00 00 00 90每年。。。。。。。。。。

默认情况下,NSScanner会忽略空白和换行符;空白字符集包括制表符(U+0009)。尝试删除此默认值:
NSScanner* theScanner = [NSScanner scannerWithString: recordString];
theScanner.charactersToBeSkipped = nil;

同样值得注意的是NSScanner属性scanLocation,在简单的情况下,这可能有助于计算实际的选项卡:

NSString *recordString = @"tttHellottGoodbyetHello";
NSScanner* theScanner = [NSScanner scannerWithString: recordString];
theScanner.charactersToBeSkipped = nil;
NSRange asciiTabRange;
asciiTabRange.location = 0x09;
asciiTabRange.length   = 1;
NSCharacterSet* asciiTab = [NSCharacterSet characterSetWithRange: asciiTabRange];
NSString *tabString;
unsigned long indexOfFirstTabInRun = 0;
unsigned long tabsInRun = 0;
while (!theScanner.isAtEnd) {
    indexOfFirstTabInRun = (unsigned long)theScanner.scanLocation;
    if ([theScanner scanCharactersFromSet: asciiTab intoString: &tabString]) {
        tabsInRun = (unsigned long) theScanner.scanLocation - indexOfFirstTabInRun;
        NSLog(@"tabCount: %lu - starting at index %lu", tabsInRun, indexOfFirstTabInRun);
    } else {
        [theScanner scanCharactersFromSet:asciiTab.invertedSet intoString:nil];
    }
}

最新更新