我想使用XCode/OSX application/Command line tool/Foundation
类型制作命令行计算器。
在XCode中,转到Products/Scheme/Edit Scheme
。在这里,我们可以添加或删除命令行参数。这些命令行参数存储在参数向量中,即argv[]
。
我正在使用NSArray
将这些参数存储在Objective-C数组中。
现在,我想制作能够评估表达的计算器。
例如我的论点是argv[1]=5
,argv[2]=+
,argv[3]= 10
,argv[4]=-
,argv[5]=2
。因此,这些参数将评估表达式并给出结果。 结果= 13 。
#import <Foundation/Foundation.h>
int main(int argc, const char* argv[])
{
@autoreleasepool {
NSArray *myarray =[[NSProcessInfo processInfo] arguments];
for (int i=1; i<argc ; i++) {
NSLog (@"Arguents %d=%@", i, myarray[i]);
}
return 0;
}
}
答案 0 :(得分:1)
这是一个简单的计算器,几分钟就被敲掉了:
#import <Foundation/Foundation.h>
typedef enum {
OP_NONE,
OP_ADD,
OP_SUB,
OP_MULT,
OP_DIV
} Op;
static int calc(NSArray *args) {
Op op = OP_NONE;
int result = 0;
for (NSString *arg in args) {
if ([arg isEqualToString:@"+"]) {
op = OP_ADD;
} else if ([arg isEqualToString:@"-"]) {
op = OP_SUB;
} else if ([arg isEqualToString:@"*"]) {
op = OP_MULT;
} else if ([arg isEqualToString:@"/"]) {
op = OP_DIV;
} else {
int value = [arg intValue]; // NO ERROR CHECKING!!!
switch(op) {
case OP_ADD: result += value; break;
case OP_SUB: result -= value; break;
case OP_MULT: result *= value; break;
case OP_DIV: result /= value; break;
case OP_NONE: result = value; break;
default: abort();
}
op = OP_NONE;
}
}
return result;
}
int main(int argc, const char **argv) {
@autoreleasepool {
NSMutableArray *args = [NSMutableArray new];
for (int i = 1; i < argc; i++)
[args addObject:@(argv[i])];
NSLog(@"result = %d", calc(args));
}
return 0;
}
编译:
$ clang -DDEBUG=1 -g -fobjc-arc -o calc calc.m -framework Foundation
试验:
typhon:tinkering (master) $ ./calc 3 + 9
2014-04-26 13:23:05.628 calc[8728:507] result = 12
typhon:tinkering (master) $ ./calc 2 / 1
2014-04-26 13:23:20.500 calc[8738:507] result = 2
typhon:tinkering (master) $ ./calc 99 / 11
2014-04-26 13:23:25.364 calc[8742:507] result = 9
typhon:tinkering (master) $ ./calc 99 / 12
2014-04-26 13:23:27.740 calc[8746:507] result = 8
typhon:tinkering (master) $ ./calc 99 \* 11
2014-04-26 13:23:53.588 calc[8754:507] result = 1089
注意:
\*
,因为*
是执行shell globbing的符号。NSProcessInfo
时,您不需要main()
来获取命令行参数。