2010-05-09 2 views
4

У меня есть простая проблема;Как запретить пользователям вводить буквы или цифры?

Вот код:

#include<stdio.h> 
main(){ 
int input; 
printf("Choose a numeric value"); 
scanf("%d",&input); 
} 

Я хочу, чтобы пользователь только ввести номера ... Так что это должно быть что-то вроде этого:

#include<stdio.h> 
main(){ 
int input; 
printf("Choose a numeric value"); 
do{ 
    scanf("%d",&input); 
}while(input!= 'something'); 
} 

Моя проблема заключается в том, что я не знать, что заменить в «что-то» ... Как я могу запретить пользователям вводить буквенные символы?

EDIT

Я только что получил что-то интересное:

#include<stdio.h> 
main(){ 
int input; 
printf("Choose a numeric value"); 
do{ 
    scanf("%d",&input); 
}while(input!= 'int'); 
} 

Добавление «INT» будет держать цикл до тех пор, как я ввожу номер, я попробовал «символ», но это не работало .. конечно, что-то для алфавитов правильно? : S Ответьте!

Благодарим за помощь!

+0

Удалить 'предельный выбор-к' тегам и «числа», я думаю, что нет никаких экспертов-разработчиков в «ограничении выбора». – 2010-05-09 00:06:21

+0

Возможный дубликат [Как запретить пользователям вводить неверные входы?] (Http://stackoverflow.com/questions/2795252/how-to-prevent-users-from-typing-incorrect-inputs) –

ответ

4

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

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
... 
int value; 
char buffer[SOME_SIZE]; 
char *chk; 
do 
{ 
    printf("Enter a number: "); 
    fflush(stdout); 
    if (fgets(buffer, sizeof buffer, stdin) != NULL) 
    { 
    value = (int) strtol(buffer, &chk, 10); /* assume decimal format */ 
    } 
} while (!isspace(*chk) && *chk != 0); 

Если chk указывает на что-то другое, кроме пробела или строки терминатор (0), то строка не является допустимым числом постоянным. Для ввода с плавающей запятой используйте strtod.

+0

Спасибо, что нашли время и ответили. Довольно продвинутые команды, используемые там, плохо разбираются в них, чтобы понять больше :) – NLed

4

Вы не можете запретить пользователю вводить что-либо, что он хочет - вы можете игнорировать все, что он/она вводит, чтобы вы не «хотели».

Типичным примером является чтение строки с помощью fgets, затем сканирование по строке и проверка того, что все входные данные были цифрами с isdigit. Если это все цифры, то конвертируйте в целое число; в противном случае выбросьте его и снова получите вход.

В качестве альтернативы, используйте strtol для преобразования. Он устанавливает указатель на конец данных, которые он может преобразовать в число; в этом случае вы (видимо) хотите, чтобы он указывал на конец строки.

Если вы не против какого-либо портативного кода, вы можете прочитать по одному символу за раз и выбросить все, кроме цифр (например, getch в Windows).

+0

Я согласен с вашим заявлением , Но как мне реализовать этот код в шахте? Я также использую цикл do-while? Извините, что я не эксперт в C :( – NLed

+0

Да, это обычно цикл do-while. 'Do {read (data);} while (! All_digits (data)); int value = convert (data);'. –

+0

Thanks для ответа. Эти команды немного слишком продвинуты для меня xD. Это может быть простой способ, который вы мне сказали, но я просто не знаю, как они работают. Спасибо, в любом случае, я пытаюсь найти способ, манипулируя переменными ACSII Удивительно, если бы это сработало? – NLed

0

Вы не должны использовать scanf читать в цифрах - см http://www.gidnetwork.com/b-63.html

Использование fgets вместо.

Однако, если вы должны использовать scanf, вы можете сделать это:

#include <stdio.h> 
    int main() { 
     char text[20]; 
     fputs("enter some number: ", stdout); 
     fflush(stdout); 
     if (fgets(text, sizeof text, stdin)) { 
      int number; 
      if (sscanf(text, "%d", &number) == 1) { 
       printf("number = %d\n", number); 
      } 
     } 
     return 0; 
    } 
+0

Спасибо за информативный ответ. Как насчет использования каких-либо манипуляций с ACSII для предотвращения буквенных символов? – NLed

0

Лично я прочитал ввод в буфер и проверил эту строку для моего номера.

char buffer [100];
плавающее значение;
do {
scanf ("% s", buffer);
} в то время (sscanf (буфер, "% F", & значение)! = 1)

Это будет цикл до тех пор, первое, что пользователь вводит на линии не является числом. Ввод может быть чем угодно, но только пройдет мимо этого блока, когда первое введенное число будет числом.
Примера ввод:
43289 (значение 43289)
43.33 (значение 43.44)
392gifah (значение 392)
ajfgds432 (продолжает петлю)