Iphone NSScanner永远不会到达“;Isattend“;或don';不完整字符串
我有一个问题,使扫描器为这个特殊的字符串工作 下面是代码:Iphone NSScanner永远不会到达“;Isattend“;或don';不完整字符串,iphone,infinite-loop,nsscanner,Iphone,Infinite Loop,Nsscanner,我有一个问题,使扫描器为这个特殊的字符串工作 下面是代码: tempString = @"30.15 in. Hg (1021 hPa)"; scanner = [NSScanner scannerWithString:tempString]; //setting the scanning location, [scanner setCharactersToBeSkipped:[[NSCharacterSet characterSetWithCharactersInString:@"012345
tempString = @"30.15 in. Hg (1021 hPa)";
scanner = [NSScanner scannerWithString:tempString]; //setting the scanning location,
[scanner setCharactersToBeSkipped:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789.,-+ "]invertedSet]];
value = 0;
_i = 0;
while([scanner isAtEnd] == NO)
{
[scanner scanFloat:&value];
if(_i == 1)
{
pressure = value;
}
_i++;
}
NSLog(@"pressure = %f hpa",pressure);
这个无限循环
如果我将字符串更改为:tempString=@“30.15英寸8.8汞柱(1021百帕)”代码>
那就好了
同样,如果我更改为:tempString=@“30.15英寸汞柱(1021百帕)”代码>
它也很好用
问题来自“.”(点)
有什么干净的解决方案可以让它工作吗
非常感谢。您可以检查-scanFloat:
返回YES以检查是否扫描了有效的浮点。如果返回“否”,则跳过该字符
while (![scanner isAtEnd]) {
if ([scanner scanFloat:&value]) {
if(_i == 1) {
pressure = value;
}
_i++;
} else {
[scanner setScanLocation:[scanner scanLocation] + 1];
}
}
谢谢,这确实是回避这个问题的好办法。另外,我很高兴了解它的工作方式:为什么点“.”使扫描仪停止,或者为什么扫描仪在while循环中永远无法到达终点。当您调用-scanFloat:
时,扫描仪会检查当前位置是否有十进制数。如果有,它会将该数字放入传递的参数中,将当前位置移到该数字之后,并返回YES。如果没有有效的数字,它将返回NO,并且不会更改位置。在原始循环中,您一直尝试扫描点,但总是失败,因为点不是有效数字。你真的应该看看这个。
tempString = @"30.15 in. Hg (1021 hPa)";
scanner = [NSScanner scannerWithString:tempString];
[scanner scanUpToString:@"(" intoString:nil];
[scanner scanString:@"(" intoString:nil];
[scanner scanFloat:&value];