NSString和NSRange的问题

时间:2011-05-28 18:23:45

标签: objective-c xcode

我在这里遇到了一个相当讨厌的问题。看,我正在尝试打破一个字符串,我将其转化为单个字符和符号。该字符串始终采用等式的形式,如“3x + 4”或“x / 7 + 5”。我需要将字符串分成单个字符串的数组。例如,如果我有第一个等式,我想要一个具有“3”,“x”,“+”和“4”的NSMutableArray。以下是我使用的代码部分:

NSMutableArray* list = [[NSMutableArray alloc] initWithCapacity:10];
for (int i = 0; i < [self.equationToGuess length]; i++) {
    NSRange range = {i, i};
    NSString* string= [[NSString alloc] initWithString:[self.equationToGuess substringWithRange:range]];
    [list addObject:string];
}

我已经确定检查self.equationToGuess是否总是包含使用调试器的等式,它确实如此。 list也能够获取一些对象,但问题是它只是将最后两个字符放在列表的一个架子中。因此,如果我有“3x + 4”等式,这段代码会将“3”,“x”和“+4”放入代码中,然后崩溃,因为它超出了字符串的长度。有谁知道如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

NSRange中的两个值不是起始和结束索引。相反,第一个是起始索引,第二个是范围的长度。所以你希望你的范围是

NSRange range = NSMakeRange(i, 1);

答案 1 :(得分:1)

让我们多做一点:

NSInteger numberOfCharacters = [self.equationToGuess length];
NSMutableArray *characterArray = [[NSMutableArray alloc] initWithCapacity:numberOfCharacters];
for (NSUInteger idx = 0; idx < numberOfCharacters; idx++) {
    NSRange range = NSMakeRange(idx, 1);
    [characterArray addObject:[self.equationToGuess substringWithRange:range]];
}

修改

在慷慨帮助谦卑的馅饼之后 - 这仍然不是最好的方法:如果你的等式具有多位数系数,它们将被分开。您是否考虑过使用NSScanner来拆分字符串?

答案 2 :(得分:0)

您也可以通过从字符串中获取字符来使用替代解决方案,因为您必须使用NSString的以下函数。

- (unichar)characterAtIndex:(NSUInteger)index

NSMutableArray* list = [[NSMutableArray alloc] initWithCapacity:10];
NSString* string;
for (int i = 0; i < [self.equationToGuess length]; i++) 
{
    string = [[NSString alloc] initWithFormat:@"%c",[self.equationToGuess characterAtIndex:i]];
    [list addObject:string];
    [string release];
     string  = nil ;
}

答案 3 :(得分:0)

NSInteger numberOfCharacters = [self.equationToGuess length];
NSMutableArray *characterArray = [[NSMutableArray alloc] initWithCapacity:numberOfCharacters];
for (NSUInteger idx = 0; idx < numberOfCharacters; idx++) {
[characterArray addObject:[NSString stringWithFormat:@"%c", [self.equationToGuess characterAtIndex:idx]]];
}