【问题标题】:How to error handle command line arguments?如何错误处理命令行参数?
【发布时间】:2020-06-26 12:20:54
【问题描述】:

我正在尝试使用这样的函数来错误处理命令行参数:

int check(char *r){
    int arg, valid = 0;
    for (int i = 0; i<sizeof(*r); i++){
        if(!isdigit(r[i]))
            valid = 0;
        else if (atoi(r)<1)
            valid = 0;
        else
            valid = 1;
    }
    if (valid == 1)
        arg = atoi(r);
    while(valid == 0){
        cout<<"Input was wrong! Please input a positive integer greater than 0: ";
        cin>>arg;
        if (arg<1 || cin.fail()){
            cin.clear();
            cin.ignore(1000, '\n');
            valid = 0;
        }
        else
            valid = 1;
    }
    return arg;
}

int main(int argc, char const *argv[]){
  int player;
  int row;
  int col;

  for (int i = 1; i<7; i+=2){
    if(argv[i][0] == '-' && argv[i][1] == 'p'){
        player = check( argv[i+1] );
    }
    else if (argv[i][0] == '-' && argv[i][1] == 'r'){
        row = check( argv[i+1] );
    }
    else if (argv[i][0] == '-' && argv[i][1] == 'c'){
        col = check( argv[i+1] );
    }
    else
        cout<<"Enter -p <number of players> -r <number of rows> -c <number of columns> "<<endl;
  }
}

但它不会编译,说没有匹配的函数调用要检查。用户应输入的示例是“./a.out -p 2 -r 6 -c 7”。检查用户是否只在命令行中输入正整数的最佳方法是什么?

编译器在编译时输出如下信息。

    main.cpp:41:15: error: no matching function for call to
      'check'
            player = check( argv[i+1] );
                     ^~~~~
main.cpp:8:5: note: candidate function not viable: 1st
      argument ('const char *') would lose const qualifier
int check(char *r){
    ^
main.cpp:44:12: error: no matching function for call to
      'check'
            row = check( argv[i+1] );
                  ^~~~~
main.cpp:8:5: note: candidate function not viable: 1st
      argument ('const char *') would lose const qualifier
int check(char *r){
    ^
main.cpp:47:12: error: no matching function for call to
      'check'
            col = check( argv[i+1] );
                  ^~~~~
main.cpp:8:5: note: candidate function not viable: 1st
      argument ('const char *') would lose const qualifier
int check(char *r){

【问题讨论】:

  • sizeof(*r) 是错误的。注意c++ sizeof() 是一个编译时间常数。
  • 除了@drescherjm 说的,你还需要int check(const char *r){...(注意const
  • 阅读错误信息的注释。 (注释与它们之前的内容一致。)没有匹配的函数,因为第一个参数是const char *,但声明的函数需要char *,并且不允许丢弃const

标签: c++ function error-handling command-line-arguments


【解决方案1】:

char const*char* 的转换无效,您需要从 char const *argv[] 中删除 const

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

或将 const 添加到 char *r

int check(const char *r)

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

int check(const char *r)

也是有效的。

另外sizeof(*r) 是单个字符的大小,而不是作为参数传递的字符数组的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2019-06-20
    • 2023-03-30
    • 2013-05-08
    • 1970-01-01
    相关资源
    最近更新 更多