执行时,可以将一些值从命令行传递给Objective-C程序。 这些值称为命令行参数,很多时候它们对程序很重要,特别是当想要从外部控制程序而不是在代码中对这些值进行硬编码时就很有用了。
命令行参数使用main()
函数参数处理,其中argc
表示传递的参数数量,argv[]
是指针数组,指向传递给程序的每个参数。 以下是一个简单的示例,它检查命令行是否提供了任何参数并采取相应的操作 -
1 #import <Foundation/Foundation.h> 2 3 int main( int argc, char *argv[] ) { 4 if( argc == 2 ) { 5 NSLog(@"The argument supplied is %s ", argv[1]); 6 } else if( argc > 2 ) { 7 NSLog(@"Too many arguments supplied. "); 8 } else { 9 NSLog(@"One argument expected. "); 10 } 11 }
当使用单个参数编译和执行上述代码时,例如使用命令行参数“testing”,它会产生以下结果。
1 $./main testing 2 2018-11-15 22:59:51.283 main[79514] The argument supplied is testing
当使用两个参数(例如testing1
和testing2
)编译和执行上述代码时,它会产生以下结果。
1 $./main testing testing2 2 2018-11-15 22:59:51.283 main[79514] Too many arguments supplied.
当编译并执行上述代码而不传递任何参数时,它会产生以下结果。
1 $./main testing testing2 2 2018-11-15 22:59:51.283 main[79514] One argument expected
应该注意的是,argv [0]
保存程序本身的名称,argv [1]
是指向提供的第一个命令行参数的指针,而* argv [n]
是最后一个参数。 如果没有提供参数,argc
的值将为1
,否则如果传递一个参数,则argc
设置为2
。
传递由空格分隔的所有命令行参数,但如果参数本身有空格,则可以通过将这些参数放在双引号(""
)或单引号(''
)中来传递这些参数。再次重写上面的例子,将打印程序名称,也通过放入双引号传递命令行参数 -
1 #import <Foundation/Foundation.h> 2 3 int main( int argc, char *argv[] ) { 4 NSLog(@"Program name %s ", argv[0]); 5 6 if( argc == 2 ) { 7 NSLog(@"The argument supplied is %s ", argv[1]); 8 } else if( argc > 2 ) { 9 NSLog(@"Too many arguments supplied. "); 10 } else { 11 NSLog(@"One argument expected. "); 12 } 13 14 return 0; 15 }
当上面的代码被编译并执行时,一个参数用空格分隔,但在双引号中是"Testing1 Testing2"
,它会产生以下结果。
1 2018-11-15 23:05:06.113 main[66421] Program name main 2 2018-11-15 23:05:06.115 main[66421] One argument expected.