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];