2012-01-09 45 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);