我刚刚开始使用Objective c(来自java),我正在研究一个计算器程序,只是为了练习语法和一些基本的东西。我正在进行的方式是让用户输入一个字符串并查看操作符(考虑操作顺序),然后找到围绕该操作符的术语,计算它,用答案替换术语,并重复所有条款;但是,我正在使用我用来计算术语的方法存在问题。我传入运算符的索引并使其向后循环,直到它击中另一个运算符以找到它之前的数字,然后对该数字执行相同的向前循环。我的问题是当它到达操作符时循环不会停止,而是继续直到字符串的两个方向结束。这可能是一件非常简单的事情,我忽略了但是我一直试图弄清楚这一点,并且可能“似乎得到它。我已经包含了方法前半部分的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;
}
答案 0 :(得分:1)
你不能在Objective-C中做到这一点:[calculation substringWithRange:prevChar] != @"*"
相反,你需要这样做:
[[calculation substringWithRange:prevChar] compare:@"*"] != NSOrderedSame
(我知道,它更长,但算术运算符不像字符串那样过载字符串)。
答案 1 :(得分:1)
我看到其他人已经回答了这个问题来纠正你的字符串比较操作的问题,但更好的方法是将这个字符串分开,这将是使用NSString的原生解析方法。例如:
NSArray *numbers = [ calculation componentsSeparatedByCharactersInSet:
[ NSCharacterSet characterSetWithCharactersInString: @"*/+-" ] ];
将为您提供一个数组,其中包含字符串中的每个数字(按顺序)。你可以提出自定义解析例程,但是使用NSString可能会更简单,也可以减少错误。其他人也可以更容易阅读和理解。
答案 2 :(得分:1)
while((![[calculation substringWithRange:prevChar] isEqualToString:@"*"]) && …){
}
或
NSArray *operators = @[@"+", @"-", @"*", @"/"];
while(![operators contains:[calculation substringWithRange:prevChar]])
答案 3 :(得分: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-[
撤消右移。