Как правильно обрабатывать аргументы командной строки? - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь обработать ошибку аргументов командной строки с помощью функции, подобной этой:

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){

1 Ответ

2 голосов
/ 15 марта 2020

char const* в char* не является допустимым преобразованием, вам необходимо удалить const из char const *argv[]

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) - это размер одного символа, а не размер массива символов, который вы передаете в качестве аргумента. ,

...