2015-08-30 1 views
0

Мне нужно получить действительный номер от пользователя от 0 до 9 без дубликатов. Действительный номер может иметь любое количество цифр, от 1 до 10. Если пользователь вводит «пробел» или любой символ, то вход недействителен. Мой алгоритм:Проверка бесконечного ввода char number

1) Создайте массив символов размером 10, затем инициализируйте все ячейки до '0'.

2) Для каждого символа, который читается от пользователя, проверьте, действительно ли символ равен 0-9.

2.1) Если значение true: подсчитайте номер ячейки +1.

2.2) Else "error".

2.3) Если я добираюсь до ячейки, у которой уже есть +1, это число уже существует, а затем «ошибка».

Теперь несколько вопросов о моей идее:

1) Есть ли лучший \ простой алгоритм, чтобы сделать это?

2) Пользователь не вводит char символом char, значит, я могу получить бесконечную длину символа, поэтому где я все храню?

+4

Если у вас не может быть двух цифр, любой вход длиной более 10 цифр в любом случае является недопустимым. – Dmitri

+0

@ Dmitri это правильно, но все же, мне нужно проверить char на char. Потому что пользователь может ввести: «14532» - это меньше 10 цифр, а также действительный номер. или может ввести: «2345s o $», который составляет менее 10 цифр, но не действительный номер. – user3075653

+2

Но вам не нужно хранить дополнительные символы ... если вы получаете больше 10, число плохое, и вы можете просто отказаться от дополнительных символов. Если вы получаете меньше/равно 10, то вы можете проверить, что те 10 (или меньше) делают действительный номер. – Dmitri

ответ

1

Ответ на 2): вы не храните символы вообще, вы обрабатываете их по одному. Вам нужно только запоминать, какие цифры вы уже видели. Я хотел бы сделать это следующим образом:

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

int main(void) 
{ 
    char seen[10] = { 0 }; 
    int c, loops; 

    for (loops = 0; (c = getchar()) != EOF && loops < 10; ++loops) 
    { 
     if (!isdigit(c)) { 
      printf ("Not a digit: %c\n", c); 
      break; 
     } 
     c -= '0'; 
     if (seen[c]) { 
      printf ("Already seen: %d\n", c); 
      break; 
     } 
     seen[c] = 1; 
    } 

    return 0; 
} 

Попробуйте изменить эту программу в качестве упражнения: снизить требования к хранению данных в seen[] массива. Как написано, он использует один байт на цифру. Заставьте программу использовать только один бит на цифру.

+0

еще не уверен, что такое EOF, но я буду искать его. Кстати, ctype.h только для использования функции isdigit? – user3075653

+0

EOF - это макрос, расширяющийся до значения конца файла, значение, отличное от любого другого значения char. Это необходимо, чтобы закончить цикл при попадании EOF. Помните: пользователь может вводить только 3 символа и ничего больше, даже не ENTER. В Unix вы можете ввести EOF, используя Ctrl-D. Да, ctype.h предоставляет прототип isdigit(). – Jens

+0

Получил это. Теперь я просматриваю ваш код в отладке, когда я добираюсь до цикла, я набираю свой номер, например «2», он хорошо работает, но затем на второй итерации он входит в 1-е, если и печатает «Не цифра», , Любая идея, почему EOF не работает хорошо? – user3075653

Смежные вопросы