目标C中的strchr?

时间:2010-04-01 18:47:06

标签: objective-c string nsstring

我正在尝试编写strchr的等价物,但是使用NSStrings ......我现在有了这个:

Boolean nsstrchr(NSString* s, char c)
{
    NSString *tmps = [NSString stringWithFormat: @"%c", c];
    NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString: tmps];
    NSRange rg = [s rangeOfCharacterFromSet: cSet];
    return rg.location != NSNotFound;
}

这似乎是不必要的复杂......有没有办法做到这一点(最好是一个不涉及将NSString转换为运行时间加倍的cstring,或者使用characterAtIndex自己编写的...:我是在NSString描述中缺少一些明显的方法?

4 个答案:

答案 0 :(得分:2)

KennyTM已经注意到(在评论中)您可以使用-[NSString rangeOfString:]代替-[NSString rangeOfCharacterFromSet]。我并不是要偷他有用的答案,但我想指出你可以把它包装在NSString的一个类别中,以便更容易使用:

@interface NSString (AdditionalStringOps)
- (BOOL) containsCharacter:(char) c;
@end

@implementation NSString (AdditionalStringOps)

- (BOOL) containsCharacter:(char) c
{
    NSString *tmp = [NSString stringWithFormat:@"%c", c];
    return [self rangeOfString:tmp].location != NSNotFound;
}

@end

然后你可以这样使用它:

if ([myString containsCharacter:'A']) {
    // Do stuff...
}

答案 1 :(得分:0)

如@KennyTM所述,请使用rangeOfString:。如果您真的需要处理char级别的内容,可以通过char*(或-UTF8String)提取-cStringUsingEncoding:,然后在那里搜索您的角色您可以使用任何其他char*(可能使用strchr)。

答案 2 :(得分:0)

Boolean nsstrchr(NSString* s, char c)
{
    NSString *tmps = [NSString stringWithFormat: @"%c", c];
    NSRange rg = [s rangeOfString: tmps];
    return rg.location != NSNotFound;
}

答案 3 :(得分:0)

几种简化。

  1. 使用[s rangeOfString:tmps]删除字符集。
  2. 可以使用[NSCharacterSet characterSetWithRange:NSMakeRange(c, 1)]创建字符集,因此您无需创建tmps
  3. strchr([s UTF8String], c) - 假设c是一个ASCII字符,并且返回的指针不会转义该函数(指针变得悬空存在风险)。