Как проверить, что ввод в командной строке является целым числом в C? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу, чтобы код для проверки ввода в командной строке был целым числом.то есть 10b недействительно.Я пытался isdigit (), но не работает?Заранее спасибо.

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>

int main(int argc, string argv[])
{
   if (argc == 2)
   {
       int key = atoi(argv[1]);

       if (isdigit(key))
       {
          printf("Success\n\%i\n", key);
          exit(0);
       }

    }
  printf("Usage: ./caesar key\n");
  return 1;
}

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Функция isdigit проверяет, представляет ли один символ одну цифру.(цифры - 0 1 2 3 4 5 6 7 8 9).

Чтобы проверить, является ли строка целым числом, вы можете использовать такую ​​функцию.Это будет

bool isNumber(char number[])
{
    int i = 0;
    // only if you need to handle negative numbers 
    if (number[0] == '-')
        i = 1;
    for (; number[i] != 0; i++)
    {
        if (!isdigit(number[i]))
            return false;
    }
    return true;
}
0 голосов
/ 11 февраля 2019

Функция isDigit проверяет, является ли один символ цифрой, то есть в диапазоне от '0'..'9'.Чтобы проверить, является ли строка числом, я бы предложил использовать функцию strtol.

long strtol(const char *str, char **str_end, int base ), которая преобразует строку str в целое число, а также устанавливает указательstr_end первому персонажу, который больше не участвовал в конверсии.Если вам требуется, чтобы ни один символ не следовал за вашим номером, то str_end должен указывать на конец строки, то есть на символ завершения строки '\0':

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

int isNumber(const char* str) {

    if (!str || *str=='\0') {  // NULL str or empty str: not a number
        return 0;
    }

    char* endOfNum;
    strtol(str,&endOfNum,10);

    if (*endOfNum == '\0') { // string is at its end; everything in it was a valid part of the number
        return 1;
    } else {
        return 0;  // something that is not part of a number followed.
    }

}

int main() {
    const char* vals[] = {
        "10b",
        "-123",
        "134 ",
        "   345",
        "",
        NULL
    };

    for (int i=0; vals[i]; i++) {
        printf("testing '%s': %d\n", vals[i], isNumber(vals[i]));
    }
}

Выходные данные:

testing '10b': 0
testing '-123': 1
testing '134 ': 0
testing '   345': 1
testing '': 0

Адаптируйте значение угловых падежей, таких как пустые строки или NULL-строки, к вашим потребностям.

0 голосов
/ 11 февраля 2019

Моей первой мыслью было бы использовать что-то вроде:

int inputvalue = 0;
if (sscanf(argv[i], "%d", &inputvalue) == 1)
{
    // it's ok....
}
else
{
    // not an integer!
}

или что-то в этом роде.Смотри http://www.cplusplus.com/reference/cstdio/sscanf/

...