1

我刚从objective c(来自java)开始,我正在开发一个计算器程序,只是为了练习语法和一些基本的东西。我的方法是让用户输入一个字符串并查找运算符(考虑操作顺序),然​​后找到围绕该运算符的术语,计算它,用答案替换术语,然后重复所有条款;但是,我用于计算术语的方法存在问题。我传入运算符的索引并让它向后循环,直到它碰到另一个运算符以找到它之前的数字,并对后面的数字执行相同的转发。我的问题是循环在遇到运算符时不会停止,而是会一直持续到两个方向的字符串末尾。它' s 可能是我忽略的非常简单的事情,但我一直试图弄清楚这一点,但似乎无法理解。我只包含了该方法前半部分的 SSCCE,其中包含预定的字符串和运算符索引。(还有一个次要问题:有没有更好的方法在这个网站上发布代码块,而不是在每行之前手动放置 4 个空格?)

#import <Foundation/Foundation.h>
int firstNumInTerm(int index);
NSString *calculation;
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        calculation = @"51-43+378*32";
        int firstNumber = firstNumInTerm(9);
        NSLog(@"The number before the term is: %i", firstNumber);    
    }
    return 0;
}

int firstNumInTerm(int index){
    int firstNumIndex = index - 1;
    int firstNumLength = 1;
    NSRange prevChar = NSMakeRange(firstNumIndex - 1, 1);
    while ([calculation substringWithRange:prevChar] != @"*" &&
           [calculation substringWithRange:prevChar] != @"/" &&
           [calculation substringWithRange:prevChar] != @"+" &&
           [calculation substringWithRange:prevChar] != @"-" &&
           firstNumIndex > 0) {
        NSLog(@"prevChar: %@", [calculation substringWithRange:prevChar]);//TEST
        firstNumIndex--; firstNumLength++;
        prevChar = NSMakeRange(firstNumIndex - 1, 1);
    }
    NSRange firstRange = NSMakeRange(firstNumIndex, firstNumLength);
    int firstNum = [[calculation substringWithRange:firstRange] intValue];

    NSLog(@"firstNum String: %@", [calculation substringWithRange:firstRange]);//TEST
    NSLog(@"firstNum int: %i", firstNum);//TEST

    return firstNum;
}
4

4 回答 4

1

在 Objective-C 中你不能这样做:[calculation substringWithRange:prevChar] != @"*" 相反,你需要这样做:

[[calculation substringWithRange:prevChar] compare:@"*"] != NSOrderedSame

(我知道,它更长,但算术运算符不会像在 Java 中那样重载字符串)。

于 2012-11-20T18:06:29.887 回答
1

我看到其他人已经回答了这个问题以纠正您的字符串比较操作的问题,但是拆分此字符串的更好方法是使用 NSString 的本机解析方法。例如:

 NSArray *numbers = [ calculation componentsSeparatedByCharactersInSet: 
 [ NSCharacterSet characterSetWithCharactersInString: @"*/+-" ] ];

将为您提供一个包含字符串中每个数字(按顺序)的数组。你可以想出自定义解析例程,但使用 NSString 可能会更直接,而且错误更少。其他人也更容易阅读和理解。

于 2012-11-20T18:12:40.290 回答
1
while((![[calculation substringWithRange:prevChar] isEqualToString:@"*"]) && …){

}

或者

NSArray *operators = @[@"+", @"-", @"*", @"/"];
while(![operators contains:[calculation substringWithRange:prevChar]])
于 2012-11-20T18:12:59.867 回答
1

这一行的问题 [calculation substringWithRange:prevChar] != @"*"是:您正在比较两个指针的值。[calculation substringWithRange:prevChar]返回一个指向NSString对象的指针,就像NSString文字语句一样@"*"。比较两个字符串的最简单方法是isEqualToString:使用NSString. 例如:

NSString *myName = @"Stephen";
NSString *yourName = @"Matt";

if([myName isEqualToString:yourName]){
    printf("We have the same name!");
}
else{
    printf("We do not have the same name");
}

如果您要进行大量字符串比较,最好编写一个宏,例如: #define STREQ(x,y) [x isEqualToString:y]

关于将代码复制/粘贴到 StackOverflow 中:

由于我 99% 的时间都在使用 XCode,因此我发现选择要复制的文本然后点击Cmd-]. 这会将文本向右移动一个制表符宽度。然后我Cmd-c复制然后Cmd-[撤消右移。

于 2012-11-21T05:23:50.050 回答