Проверьте аргументы командной строки не char c ++ - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь проверить, что аргумент командной строки - это либо алфавиты, либо число

int main(int argc, char* argv[])
{
    if(argv[1] is not int) //How does it check if it is number or alphabets
    { 
        cerr<< "arguments must be integer" << endl;
        return -1;
    }
}

, если я запускаю в терминале linux, вывод будет похож на

./a.out aasmsnsak
arguments must be integer

Ответы [ 3 ]

4 голосов
/ 30 октября 2019

Один из способов сделать это со стандартной библиотекой - использовать strtol из <cstdlib>. Другой использует istringstream.

char *endptr;
const long int argument = strtol (argv[1], &endptr, 10);  // <cstdlib>
if(endptr[0] != '\0') {
    cerr << "arguments must be integer" << endl;
    return -1;
} else if (argument == LONG_MIN || argument == LONG_MAX) {  // <climits>
    // Alternatively you can check for ERANGE in errno
    cerr << "arguments value is out of range" << endl;
    return -1;
} else {
    /* Right type of argument received */
    [..]
}

Демо с использованием strtol

istringstream iss(argv[1]);
int argument;
char more;
if(iss >> argument) {
    if(iss >> more) {
        cerr << p << ": arguments must be integer" << endl;
        return -1;
    } else {
        /* Right type of argument received */
        [..]
    }
} else {
    cerr << p << ": arguments must be integer" << endl;
    return -1;
}

Демо с использованием istringstream

1 голос
/ 30 октября 2019

Сначала аргументы командной строки могут состоять из нескольких символов. Поэтому вам придется перебирать все из них:

for(char* arg = argv[1]; *arg; ++arg)

Теперь я предполагаю, что вы хотите классифицировать строку, содержащую любой нецифровый символ, как нечисловой, поэтому внутриВ цикле вы должны проверять каждый символ на наличие цифр:

if(!isdigit(static_cast<unsigned char>(*arg)))
{
    // non-number-string!

    break; // no need to go on...
}

В другом варианте можно просто попытаться привести к числу:

std::istringstream s(argv[1]);
int n;
s >> n;
if(s) // number read?
{
    char c;
    s >> c;
    if(!s.eof())
    {
        // not last character reached!
        // -> no number
    }
}

Или:

char* end;
long number = strtol(argv[1], &end, 10);
//                              ^ needed for detecting, if end of string reached
if(*end || errno == ERANGE)
{
    // doesn't point to terminating null character -> no number
    // or number read was out of range
}

Вариант в стиле C:

int n, int l;
if(sscanf(argv[1], "%d%n", &n, &l) == 1 && argv[1][l] == 0)
{
    // successfully scanned an integer and end of string reached -> is a number
}
0 голосов
/ 30 октября 2019

Они действительно всегда char, даже если это не буквенные символы. То, что вам нужно, это попытаться разобрать их в правильный числовой тип и вывести оттуда состояние приложений.

Редактировать: вам, вероятно, следует использовать strol для этого. Это не обязательно C ++, но сделает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...