Проверьте, является ли пользовательский ввод допустимой строкой или не использует C - PullRequest
2 голосов
/ 08 мая 2009

Я получаю строку ввода от пользователя. Но как мне проверить, ввел ли пользователь строку или число?

Ответы [ 7 ]

7 голосов
/ 08 мая 2009

Вызовите strtol, убедитесь, что значение, сохраненное в endptr, не равно входному значению (успешное преобразование) и является указателем на байт NUL (использовалась вся строка).

http://www.opengroup.org/onlinepubs/000095399/functions/strtol.html

объясняет, что если вы также хотите обнаружить переполнение, уловка состоит в том, чтобы установить errno на 0, затем вызвать strtol, а затем проверить, что errno по-прежнему равно 0.

Если вы хотите быть педантичным, вы также должны проверить с помощью isspace (), что первый символ входной строки не является пробелом. Причина в том, что strtol и друзья пропускают начальные пробелы, но, возможно, вы не считаете «1» действительным числом.

Альтернативные варианты включают strtoll и strtod соответственно, если вы хотите разрешить большие числа или нецелые числа.

2 голосов
/ 08 мая 2009

Здесь уже много хороших эвристик.

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

Это существенная тема сама по себе. Смотрите один из май "Как собрать компилятор?" вопросы по StackOverflow для ссылок ... (например, Обучение написанию компилятора ).

2 голосов
/ 08 мая 2009
int isNum;
 if ((isNum = strtol(string, NULL, 10)))
  printf(" '%d' numbers was found!\n", isNum);
else
 {
     printf("No number found");
 }

Все считанные действительные символы преобразуются, если строка начинается с недопустимого символа, функция возвращает НОЛЬ (0).

strtol () пример который показывает, как распечатать следующие символы после чисел или часть строки, которая не является цифрами.

или

 int isNum
 isNum = atoi(string);
2 голосов
/ 08 мая 2009

Вы можете проверить, является ли это цифрой:

char c;
scanf( "%c", &c );
if( isdigit(c) )
  printf( "You entered the digit %c\n", c );
1 голос
/ 08 мая 2009

Вы не указали, какие «числа» вы ожидаете. В зависимости от допустимого набора входных данных, вы можете вызвать ряд стандартных библиотечных функций, как указано другими. Например: простая проверка, является ли она цифрой, не работает, если вы ожидаете числа с плавающей запятой. Также обратите внимание, что недостаточно вызвать библиотечные функции, но вам также нужно проверить наличие возвращаемых значений (то есть ошибок, если они произошли во время преобразования).

Кроме того, вы можете использовать функцию sscanf для получения чисел.

Наконец, целое число может быть сохранено в виде int или его вариантов (long и т. Д.) Или числа с плавающей запятой. Звонок твой.

1 голос
/ 08 мая 2009

Вы можете использовать atoi или atof, а затем проверить, не равно ли значение, возвращаемое этой функцией 0. Это не является непогрешимым, поскольку пользователь мог ввести «0».

Другим способом было бы проверить, что каждый символ в строке равен [0-9], +/- или десятичной точке, и отклонить каждую строку, которая не соответствует.

0 голосов
/ 08 мая 2009

Вместо использования таких функций, как strtol, atoi, atof .. Вы можете определить свою собственную функцию, которая будет анализировать символ за символом строки и формирует выходное целое число. В случае, если во время этого анализа символ не является цифрой, можно смело утверждать, что строка в NaN. Или же вы можете также использовать isdigit () и проверять каждый символ, и если все символы являются цифрами, преобразуйте строку в число, используя atoi.

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