Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将NSString中的每个字符与字符集合进行比较_Objective C_Nsstring_Nscharacterset - Fatal编程技术网

Objective c 将NSString中的每个字符与字符集合进行比较

Objective c 将NSString中的每个字符与字符集合进行比较,objective-c,nsstring,nscharacterset,Objective C,Nsstring,Nscharacterset,我的目的是分析用户从文本字段输入的内容,并检查他是否使用了任何符号 例如,用户的输入是“/ardv/*k”,我需要一个表示用户键入3个符号的变量 我不理解如何使用NSRange搜索字符串,因为它在找到第一个匹配项时立即停止 此外,NSSet与characterAtIndex选择器不兼容 艾斯夸托:没用 下面是我所做的,但我想知道如果可能的话,如何使代码更简单: ... NSString *testThisString = @"/ardv/*k"; NSChar

我的目的是分析用户从文本字段输入的内容,并检查他是否使用了任何符号

例如,用户的输入是“/ardv/*k”,我需要一个表示用户键入3个符号的变量

我不理解如何使用NSRange搜索字符串,因为它在找到第一个匹配项时立即停止

此外,NSSet与characterAtIndex选择器不兼容

艾斯夸托:没用

下面是我所做的,但我想知道如果可能的话,如何使代码更简单:

  ...
    NSString *testThisString = @"/ardv/*k";        
    NSCharacterSet *unknownFlags1 = [NSCharacterSet punctuationCharacterSet];
    NSCharacterSet *unknownFlags2 = [NSCharacterSet symbolCharacterSet];
    NSCharacterSet *unknownFlags3 = [NSCharacterSet whitespaceCharacterSet];

    int count = 0;
    for (int i = 0; i < [testThisString length]; i++) {
    if ([unknownFlags1 characterIsMember:[testThisString characterAtIndex:i]] |
   [unknownFlags2 characterIsMember:[testThisString characterAtIndex:i]] | 
   [unknownFlags3 characterIsMember:[testThisString characterAtIndex:i]]) {
        count++;
    }
}
    NSLog(@"There are %d unknowns", count);
  ...
。。。
NSString*testThisString=@/ardv/*k”;
NSCharacterSet*unknownFlags1=[NSCharacterSet标点字符集];
NSCharacterSet*unknownFlags2=[NSCharacterSet symbolCharacterSet];
NSCharacterSet*unknownFlags3=[NSCharacterSet whitespaceCharacterSet];
整数计数=0;
对于(int i=0;i<[testThisString长度];i++){
if([unknownFlags1 Characteristic成员:[testThisString字符索引:i]]|
[unknownFlags2 Characteristic成员:[测试此字符串字符索引:i]]
[unknownFlags3 Characteristic成员:[testThisString字符索引:i]]{
计数++;
}
}
NSLog(@“有%d个未知项”,计数);
...
此外,NSSet与characterAtIndex选择器不兼容


它们都是unichar,所以你可以这样做。你做得很好。

要检查字符串是否有属于某个集合的字符,只需执行以下操作:

NSString *testString = @"hello$%^";
NSRange r = [testString rangeOfCharacterFromSet:[NSCharacterSet punctuationCharacterSet]];
if (r.location != NSNotFound) {
    // the string contains a punctuation character
}
如果您想知道标点符号的所有位置,只需使用不同的输入范围继续搜索即可。比如:

NSRange searchRange = NSMakeRange(0, [testString length]);
while (searchRange.location != NSNotFound) {
    NSRange foundRange = [searchString rangeOrCharacterFromSet:[NSCharacterSet punctuationCharacterSet] options:0 range:searchRange];
    searchRange.location = foundRange.location + 1;
    searchRange.length = [testString length] - searchRange.location;
    if (foundRange.location != NSNotFound) {
        // found a character at foundRange.location
    }
}

坦白地说,我只是循环遍历字符串的字符,逐个检查每个字符,然后通过if梯形图或类似的方法运行每个字符,以检查您的“符号”。可能比任何使用字符集的克鲁格都要快,而且更容易理解和维护

提示:仅从字符串中提取一次字符,并将其放入
unichar
temp,而不是多次重复
characterAtIndex
。更快更清晰


此外,如果正在处理的字符集是ASCII(即字符值为127或更少),则可以组成一个位或字节数组来指示每个字符的有效性。(您甚至可以对更宽的字符执行此操作,但贴图数组会变大。)虽然没有NSCharacterSet那么优雅,但您可以将所有条件折叠到一个对象中。(您也可以将所有条件折叠到一个NSCharacterSet中,但这需要提取位图并将它们排列在一起。)

您列出的任何内容都不起作用-您迄今为止尝试的所有“算法”都有一个有缺陷的逻辑。您需要做的是逐个字符地检查字符串,看看它是否是
[NSCharacterSet标点符号characterset]
(或您想要使用的任何字符集)的成员。好的,谢谢。我想我会问,因为我花了几个小时才算出来,看起来很笨拙。在典型的C或C++中,你用ASCII代码检查这个……这里有标点符号集来检查。因此,只需使用2-3行代码就可以玩得很开心:)它应该是“rangeOfCharacterFromSet”,而不是“rangeOfCharactersFromSet”
NSRange searchRange = NSMakeRange(0, [testString length]);
while (searchRange.location != NSNotFound) {
    NSRange foundRange = [searchString rangeOrCharacterFromSet:[NSCharacterSet punctuationCharacterSet] options:0 range:searchRange];
    searchRange.location = foundRange.location + 1;
    searchRange.length = [testString length] - searchRange.location;
    if (foundRange.location != NSNotFound) {
        // found a character at foundRange.location
    }
}