2016-11-28 3 views
3

Прежде всего, я говорю о старомодном ANSI-C (я имею в виду стандарт ANSI и не C99 или новее), скомпилированный с gcc. Мне разрешено использовать библиотеки, которые можно увидеть ниже в коде.Как проверить, являются ли параметры командной строки целыми числами

Моя проблема у меня есть программа, которая называется следующим образом на терминале:

program < integer_1 integer_2 

В то время как я был в состоянии выяснить, как проверить число аргументов, я застрял при проверке, являются ли они целыми числами. Если программа называется так:

program < 1 -13 

он должен работать без ропота, но если он выполняется так:

program < s 7 

он должен выбросить ошибку.

Все, что я пробовал до сих пор, было полным мусором. Лучшее, что мне удалось до сих пор, было сообщение об ошибке, если второе число было символом. Ни одна из моих попыток не имела возможности иметь дело с более чем одной цифрой, но я выяснил, почему это так.

Проблема в том, что я не использовал аргументы командной строки/терминала с любым языком программирования i now (C++, Java). Я был бы очень признателен, если бы кто-нибудь мог показать мне, как проверить правильность ввода, так как я откровенен из идей.

Я исправлю, что если я хочу иметь дело с цифрами больше 9, мне нужно перебирать argv, начиная с индекса 2, пока не найду пробел?

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

int main(int arc, char *argv[]) 
{ 
    if(arc != 3) 
    { 
    printf("Error: You have entered %d arguments, but two were expected!", arc - 1); 
    return -1; 
    } 

    return 0; 
} 
+2

Все аргументы командной строки являются строками. Вы можете преобразовать строки в целые числа, используя 'atoi()' без проверки ошибок, или используя 'strtol()' или один из его родственников с точной и чувствительной, но очень [деликатной проверкой ошибок] (http://stackoverflow.com/questions/14176123/правильно-использование-оф-strtol). Обратите внимание, что в ваших командных строках отображается '<', что означает, что оболочка пытается перенаправить стандартный ввод из файла с именем, заданным следующим аргументом ('1' и' s' в примерах) и удаляет оба '' ' и имя файла из командной строки. Вы должны просто удалить символ '<'. –

ответ

4

Самый простой выход, чтобы перебрать argv[n] с и пройти по одному им strtol() или аналогичный. Затем проверьте наличие ошибки и примите решение. Цитирую man page, (курсив мой)

long int strtol(const char *nptr, char **endptr, int base);

[...]

Если endptr не NULL, strtol() хранит адрес первого недопустимого символа в *endptr. Если цифр не было вообще, strtol() сохраняет исходное значение nptr в *endptr (и возвращает 0). В частности, если *nptr не является '\0', но **endptr является '\0' по возвращении, вся строка действительна.

Это говорит, program < integer_1 integer_2 это не совсем так, чтобы передать аргументы командной строки. Если вы хотите передать аргументы значений в качестве аргументов командной строки, вы потеряете оператор перенаправления и будете работать с argc и argv[n] s напрямую.

0

Лучший способ - создать функцию для проверки того, является ли это число или нет. если функция ниже возвращает true, используйте atoi (argv []), чтобы преобразовать их в целые числа, чтобы использовать их дальше.

bool isNumber(char number[]) 
{ 
    int i = 0; 

    //checking for negative numbers 
    if (number[0] == '-') 
     i = 1; 
    for (; number[i] != 0; i++) 
    { 
     //if (number[i] > '9' || number[i] < '0') 
     if (!isdigit(number[i])) 
      return false; 
    } 
    return true; 
} 
+0

Я пробовал это. Он работает, если я делаю что-то вроде этого: имя_программы 7 g или имя_программы gh tz, но это не сработает, если я сначала введу char/string, а затем число вроде этого: program_name: yu 5. Это был момент, когда я застрял когда я попробовал это самостоятельно. – Willi

+0

Не могли бы вы поделиться точным тестовым случаем ... bcz код должен работать –

+0

, а также обновить сообщение с помощью текущего решения –

0

Вы можете попробовать что-то вроде этого:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int check_cmd_args(char const *str[], int numargs); 

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

    if (argc < 2) { 
     printf("Not enough command line arguements entered\n"); 
     exit(EXIT_FAILURE); 
    } 

    if (check_cmd_args(argv, argc)) { 
     printf("All Command line arguements are integers\n"); 
    } else { 
     printf("Error, non-integer command line arguement entered\n"); 
    } 

    return 0; 
} 

int 
check_cmd_args(char const *str[], int numargs) { 
    int n, i = 0; 

    for (n = 1; n < numargs; n++) { 
     if (str[n][0] == '-') { 
      i = 1; 
     } 
     for (; str[n][i]; i++) { 
      if (!isdigit(str[n][i])) { 
       return 0; 
      } 
     } 
    } 
    return 1; 
} 
0

Просто комментарий: не ответ

Если вы собираетесь использовать

program < arg1 arg2 

Вы не увидите arg1 или arg2 в основных параметрах. arg1 обычно является именем файла или устройством, которое содержит данные, которые будут прочитаны программой. Я не знаю, сможет ли программа получить доступ к arg2. Если вы хотите забрать arg1 arg2 и т. Д., Потеряйте <

program arg1 arg2 
Смежные вопросы