命令行参数


当 Objective-C 程序执行时,可以将一些值从命令行传递给它们。这些值称为命令行参数,很多时候它们对您的程序很重要,特别是当您想从外部控制程序而不是在代码内对这些值进行硬编码时。

命令行参数使用 main() 函数参数处理,其中argc指传递的参数数量,argv[]是一个指针数组,它指向传递给程序的每个参数。以下是一个简单的示例,它检查是否有从命令行提供的任何参数并采取相应的操作 -

#import <Foundation/Foundation.h>

int main( int argc, char *argv[] ) {
   if( argc == 2 ) {
      NSLog(@"The argument supplied is %s\n", argv[1]);
   } else if( argc > 2 ) {
      NSLog(@"Too many arguments supplied.\n");
   } else {
      NSLog(@"One argument expected.\n");
   }
}

当使用单个参数(例如“测试”)编译并执行上述代码时,它会产生以下结果。

2013-09-13 03:01:17.333 demo[7640] The argument supplied is testing

当上面的代码使用两个参数(例如testing1和testing2)编译并执行时,它会产生以下结果。

2013-09-13 03:01:18.333 demo[7640] Too many arguments supplied.

当上面的代码在不传递任何参数的情况下编译并执行时,它会产生以下结果。

2013-09-13 03:01:18.333 demo[7640] One argument expected

应该注意的是,argv[0]保存程序本身的名称,argv[1]是指向提供的第一个命令行参数的指针,*argv[n] 是最后一个参数。如果未提供任何参数,则 argc 将为 1,否则如果传递一个参数,则argc将设置为 2。

您传递由空格分隔的所有命令行参数,但如果参数本身有空格,则可以通过将这些参数放在双引号“”或单引号“”内来传递此类参数。让我们再次重写上面的示例,我们将打印程序名称,并且还通过放入双引号来传递命令行参数 -

#import <Foundation/Foundation.h>

int main( int argc, char *argv[] ) {
   NSLog(@"Program name %s\n", argv[0]);
 
   if( argc == 2 ) {
      NSLog(@"The argument supplied is %s\n", argv[1]);
   } else if( argc > 2 ) {
      NSLog(@"Too many arguments supplied.\n");
   } else {
      NSLog(@"One argument expected.\n");
   }
   
   return 0;
}

当使用由空格分隔但在双引号内的单个参数编译并执行上面的代码时,显示“Testing1 Testing2”,它会产生以下结果。

2017-11-30 06:36:59.081 main[71010] Program name main
2017-11-30 06:36:59.082 main[71010] One argument expected.