Turbo C++ cin() не работает вместе с gets()

Вот фрагмент кода, который я написал, используя С++ в Turbo C++ IDE. Проблема, с которой я столкнулся, заключается в том, что после использования gets() cin не работает, так как пропускает входные данные. Может ли кто-нибудь найти решение этой проблемы. Вот фрагмент кода: -

        #include<iostream.h>
        #include<conio.h>
        #include<stdio.h>   
        int Resc()
           {
              char fName[10],lName[10],addr[100],usr[70],pass[20];
              int   d,y,m;
              unsigned int phNo;
              char *Gend; 
             clrscr();
             cout<<"Enter First Name :"<<endl;
             gets(fName);
             cout<<"Enter Last Name :"<<endl;
             gets(lName);
             cout<<"Enter Gender :"<<endl;
             gets(Gend);
             cout<<"Enter Address:"<<endl;
             gets(addr);
             cout<<"Enter Date Of Birth (d/m/y):"<<endl;
             cin>>d>>m>>y;
             cout<<"Enter Phone Number :"<<endl;
             cin>>phNo;
             cout<<"Enter Username:"<<endl;
             gets(usr);
             cout<<"Enter Password:"<<endl;
             gets(pass);
             getch();
             return 0;
           }

Это было бы большим подспорьем. Спасибо.


person holapancakes    schedule 20.10.2018    source источник
comment
было бы неплохо дать кусок кода, который компилируется, чтобы не учитывать, что все заголовочные файлы включены...   -  person OznOg    schedule 20.10.2018
comment
Да, я внес следующие изменения, надеюсь, это может быть полезно.   -  person holapancakes    schedule 20.10.2018
comment
Вы также должны показать объявления переменных.   -  person Sebastian Redl    schedule 20.10.2018
comment
Принял это к сведению.   -  person holapancakes    schedule 20.10.2018


Ответы (2)


Turbo-C++ древний. Есть бесплатные компиляторы, которые намного лучше. Хотя я понимаю, что в некоторых странах, к сожалению, это все еще требуется от педагогов. Однако, если есть какой-либо способ использовать альтернативу, вы должны это сделать. Код, который вы сейчас учитесь писать, не будет компилироваться с помощью компиляторов, реально используемых в отрасли. Это создаст проблемы для вас в будущей работе.

gets — худшая функция, когда-либо попадавшая в стандартную библиотеку языка. Невозможно правильно использовать. Никогда не используйте его. Исключите его существование из своего ума.

Не смешивайте ввод-вывод C и C++. Это приводит к сложным проблемам, когда они выходят из синхронизации. Используйте тот или иной, исключительно. Если вы используете C I/O, используйте scanf и fgets с stdin, а не gets. Если вы используете ввод-вывод C++, используйте исключительно cin. Обратите внимание, что синтаксический анализ даты "д/м/г" с cin немного сложен. С другой стороны, использование cin позволило бы вам использовать string вместо массивов символов, что было бы намного лучше. (Например, это означало бы, что вы можете вводить имена длиннее 9 символов, не заставляя вашу программу делать странные вещи.)

Gend, вероятно, должен быть одиночным char вместо указателя, указывающего ни на что. Эта часть вашей программы просто неверна и крайне вероятно, что она будет работать неправильно или рухнет.

Номера телефонов не являются целыми числами. Они часто начинаются с нулей, обычно содержат знаки препинания и пробелы и достаточно длинны, чтобы переполнить unsigned int. (В тот момент, когда вы используете префикс региона или оператора связи, целочисленная интерпретация, вероятно, больше 4000000000.) Всегда используйте строки для хранения телефонных номеров.

person Sebastian Redl    schedule 20.10.2018

По сути, gets() не является функцией C++ (она существует, потому что вся библиотека C доступна для C++)

Дело в том, что вы путаете использование буферизованного ввода (используя пакет stdio) с буферизованной системой ввода C++. И буферы ударяются друг о друга.

Не смешивайте системы ввода-вывода с буферизацией stdio и С++, так как вы получите такого рода проблемы. То, что происходит внутри реализации Turbo C++, проверить невозможно, так как 1) вы не указали, какую версию TC++ используете, и 2) у меня нет под рукой такого компилятора для тестов.

person Luis Colorado    schedule 22.10.2018