Как запретить пользователю вводить больше входных данных в c ++?

0

Предположим, что я создал массив символов, скажем, 20 байтов, и предложит использовать для ввода их имени, если их имя не должно превышать 20 символов... Например:

char Name[20];
gets(Name);

Теперь предположим, что его имя - abcdefghijklmnopqrstuvwxyz. Но как только он войдет в abcdefghijklmnopqrst, имя не должно вводить никаких дополнительных данных... Ни один дополнительный вход, предоставленный пользователем, не должен появляться на экране консоли... Только курсор должен мигать, пока он не нажмет войти. Итак, как это сделать?

Больше информации

Операционная система: Windows 7

Компилятор: Visual C++ 2010 Express

  • 7
    Простой и единственный ответ: не использовать gets .
  • 1
    @ Ангел, неважно. Мне нужно больше кофе.
Показать ещё 1 комментарий
Теги:

2 ответа

3
Лучший ответ

В manpage говорится:

Никогда не используйте gets(). Потому что невозможно сказать, не зная заранее данные, сколько символов будет получать(), и потому что gets() будет продолжать хранить символы, находящиеся за концом буфера, крайне опасно использовать. Он используется для защиты компьютерной безопасности. Вместо этого используйте fgets().

Таким образом, вы можете использовать fgets:

char *fgets(char *s, int size, FILE *stream);

Однако входная последовательность еще не прекращается; однако вы больше не работаете с неопределенными поведением и дырами в области безопасности, если они используются правильно.

Вам лучше использовать объекты C++, такие как std::string, std::getline и стандартные iostreams. Они не позволят вам остановить ввод, однако они предотвращают дыры в безопасности при использовании в каноническом режиме.

Резюме стандартных альтернатив:

  • gets() не может быть использована правильно. Люди могут умереть, когда вы используете это (вы не найдете улыбки на моем лице, поскольку я не шучу). Невозможно использовать его правильно. Не забывайте об этом, но выкиньте его из панели инструментов.
  • fgets() можно использовать правильно, но есть много возможностей злоупотреблять им.
  • iostreams и string автоматически используются правильно. Используй их.

К сожалению, нет встроенного решения для чтения с макс. N символов из ввода без необходимости отбрасывать лишние символы, набранные. Вам придется использовать стороннюю библиотеку или сворачивать свои собственные.

  • 0
    Я искал о fgets (), и все это говорит о том, что он читает текст из файлов .txt ... Так как мне сделать так, чтобы он читался от пользователя ??
  • 0
    @ TheDreamCoder17, передав ему указатель файла на стандартный ввод :)
Показать ещё 1 комментарий
0

Здесь глупый ответ: если вы хотите, например, чтобы пользователь вводил имя с максимум 20 символами, создайте массив char. size [20] Попросите пользователя ввести размер имени и проверить правильность номера, если его меньше или равно.20, затем перейдите и добавьте имя, чтобы еще раз попросить пользователя ввести размер снова. Вы можете использовать строку вместо символа, но это не гарантирует, что пользователь действительно соблюдает правило размера. Например, пользователь может ввести размер 10, и программа позволит ему ввести имя, но как только он разрешит, если вы используя the.string, он может написать столько, сколько пожелает.

ИЛИ используя массив символов. для имени с 20 или менее символами.

Например, для кода нужен простой цикл. Поскольку мы уже имеем размер, который меньше или равен.20

For (int я = 0; я <20; i++) Cin >> char [i] Затем вы можете назначить символы в строку.

  • 0
    Я могу это сделать, но что, если он введет свое имя неправильно !! Затем он снова должен ввести свое полное имя ... Это главная проблема!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню