NSScanner scanUpToCharactersFromSet提供BAD ACCESS

时间:2012-05-30 12:58:53

标签: iphone objective-c ipad nsscanner

NSString*test=[NSString stringWithString:inputString]; 
NSScanner*scan;
BOOL pass= [scan scanUpToCharactersFromSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet] intoString:&test];

最后一行崩溃了访问权限不佳的应用。它与地址符号&有关吗?我不清楚它为什么需要这种类型的语法。

如果inputString包含任何非字母数字字符,我只想检查我的BOOL。如果是,pass变为YES。

更新:我看到我完全不了解扫描仪。我理解这个输出:

NSString*test=@"Hello"; // this should cause my BOOL to be NO since no characters are scanned
NSScanner*scanix=[NSScanner scannerWithString:test];
BOOL pass= [scanix scanUpToCharactersFromSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet] intoString:nil];
NSLog(@"pass is %i for %@",pass, test);

记录结果:pass is 1 for Hello

我想知道的是,实际上测试字符串是否包含非字母数字字符。我如何将这样的测试纳入考虑范围?

3 个答案:

答案 0 :(得分:2)

您应该使用要解析的字符串初始化扫描仪,

    NSScanner *scan =[NSScanner scannerWithString:mystring];

答案 1 :(得分:1)

您正在混合目标字符串和源字符串。您的来源是test。此外,您的扫描仪未初始化。

NSScanner *scan = [NSScanner scannerWithString:test];
BOOL didScanCharacters = [scan scanUpToCharactersFromSet:
   [[NSCharacterSet alphanumericCharacterSet] invertedSet] 
   intoString:nil];

发生EXC_BAD_ACCESS错误是因为您正在向不存在的对象发送消息。

答案 2 :(得分:1)

  

我想知道的是,实际上测试字符串是否包含   非字母数字字符。我如何将这样的测试纳入考虑范围?

如果这是您唯一的目标,则无需使用NSScanner。您只需使用NSString的-rangeOfCharacterFromSet:方法:

NSCharacterSet *nonAlphanumeric = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
pass = ([test rangeOfCharacterFromSet:nonAlphanumeric].location != NSNotFound);