Objective-C命令行參數

執行時,可以將一些值從命令行傳遞給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");
   }
}

當使用單個參數編譯和執行上述代碼時,例如使用命令行參數“testing”,它會產生以下結果。

$./main testing
2018-11-15 22:59:51.283 main[79514] The argument supplied is testing

當使用兩個參數(例如testing1testing2)編譯和執行上述代碼時,它會產生以下結果。

$./main testing testing2
2018-11-15 22:59:51.283 main[79514] Too many arguments supplied.

當編譯並執行上述代碼而不傳遞任何參數時,它會產生以下結果。

$./main testing testing2
2018-11-15 22:59:51.283 main[79514] 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",它會產生以下結果。

2018-11-15 23:05:06.113 main[66421] Program name main
2018-11-15 23:05:06.115 main[66421] One argument expected.

以下是糾正/補充內容:

第一個例子中,當不傳遞參數時,執行最後一個條件,為何貼出來的依舊是傳了兩個參數。應該將後面兩個參數去掉才行  提交時間:2019-09-07
上一篇: Objective-C錯誤處理 下一篇: Objective-C類和對象