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