2012-01-09 21 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が' 'のchar *' と入力期待しますが、引数3は 「int型

を入力しています

ヘルプ機能でプログラム名を印刷する方法は?あなたは(char型へのポインタ別名)文字列の配列を渡しているので、char**を使用して

help(argv); 

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

でなければなりません

+0

は* ARGV [] 'ではなく'するchar * argv'文字 'として引数を宣言するだけです。 – khachik

答えて

11

+0

+1トリックをやった! – pr1m3x

2

逆参照する必要はありません。 [0]*argvと同じです。char*が必要な場合はcharとなります。

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

また、あなたはそれをこのようにやりたいことがあります。

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

次の変更に

void help(const char *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) { 
    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で変数を渡すたび、あなたは変数の型を変更しないことを確認してください、と1つの例外は配列表現をポインタ表現に変換できることです。だから、

char *argv[] 

char **argv 

として受け取られるべきで、その後通過は

myfunc(argv); 
関連する問題