2012-01-09 77 views
3

這是我的程序。無法通過argv功能

#include <stdio.h> 

void help(const char *argv); 

int main(int argc, const char *argv[]) { 

    const char *p; 
    int x; 

    for(x = 0; x < argc; x++) { 
     p = argv[x]; 
     if(*p == '-') { 
      p++; 
     } 
     switch(*p) {  
      case 'h': 
       help(*argv); 
       return 0; 
      break; 
     } 
    } 
    return 0; 
} 

void help(const char *argv) { 
    fprintf(stderr, "Usage %s: [option]\n", argv[0]); 
} 

的問題是,在編譯過程中,我得到

警告:格式 '%s' 的預期輸入 '字符*',但爭論3的類型爲 '詮釋'

如何在幫助功能中打印程序名稱?

+0

聲明參數作爲'的char * argv的[]','不字符* argv'。 – khachik 2012-01-09 15:45:10

回答

11

這應該是

help(argv); 

void help(const char **argv) { 
    fprintf(stderr, "Usage %s: [option]\n", argv[0]); 
} 

使用char**,因爲你正在傳遞一個字符串數組(又名指向char)。

+0

+1它做到了! – pr1m3x 2012-01-09 15:45:22

2

有沒有必要取消引用它。 [0]*argv相同,當您需要char*時,這將是char

void help(const char *argv) { 
    fprintf(stderr, "Usage %s: [option]\n", argv); 
} 

或者,您可能希望做這種方式:

help(argv); // don't dereference 

//... 

void help(const char **argv) { 
    fprintf(stderr, "Usage %s: [option]\n", argv[0]); 
} 
1

開始通過改變

void help(const char *argv); 

void help(const char *argv[]); 
//or 
void help(const char **argv); 

下一個變化

void help(const char *argv) { 
    fprintf(stderr, "Usage %s: [option]\n", argv[0]); 
} 

到 v

oid help(const char **argv) { // or with []... 
    fprintf(stderr, "Usage %s: [option]\n", argv[0]); 
} 

,並調用它像:

help(argv); 
1

不管何時你傳遞一個在C變量,確保你不改變變量的類型,與可以將數組表示形式轉換爲指針表示形式的一個例外。所以

char *argv[] 

應收到

char **argv 

,然後傳球簡直就是

myfunc(argv);