После ввода числа (например, возраста) считываю строку (например, имя-фамилию), но получаю в результате лишнюю пустую строку. Откуда она берется и как от нее избавиться?
Например,
struct Person
{
char firstname[20];
char lastname[20];
int age;
};
Person p;
cin >> p.age;
cin.getline(p.firstname,20);
cin.getline(p.lastname,20);
После этого в p.firstname оказывается пустая строка, а в p.lastname - введенное для p.firstname.
То же самое при попытке работать с функциями C
scanf("%d",&p.age);
fgets(p.firstname,10,stdin);
fgets(p.lastname,10,stdin);
Такая проблема чтения обычно вызвана тем, что после форматного чтения выполняется, например, чтение строки. Не вошедшие в форматные данные символы (обычно символ перехода на новую строку) при этом остаются в буфере ввода и считываются при следующем чтении как [пустая] строка.
Вот как может выглядеть такой неверный код на C:
fscanf(file,"%d",&intVar);
fgets(buf,buflen,file);
(само собой, то же относится и к вводу с клавиатуры - типа scanf("%d",&intVar)).
Или в C++:
inputStream >> intVar;
inputStream.getline(buf,buflen);
Могут быть и другие варианты.
Лечение (если не менять саму логику и функции чтения, что, конечно, тоже возможно) заключается в сбросе буфера ввода - игнорировании всех символов до конца строки между форматным вводом и вводом следующей строки.
В C++ это можно сделать при помощи следующего кода (который означает - игнорировать все символы до '\n' включительно):
inputStream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
В C можно явно считать и игнорировать все символы до конца строки:
while(fgetc(file) != '\n');
(Конечно же, имеет смысл также выполнять проверку на ошибку чтения - что считанный символ не равен EOF. При чтении с клавиатуры можно просто использовать stdin вместо file, можно - getchar().)
Еще один вариант на C -
fscanf(file,"%*[^\n]");
fscanf(file,"%*c");
Другой вариант: пропустить все, что не является буквой
while(!isalpha(file.peek()))
file.ignore();
file.getline(buf, buflen);
Проще всего:
cin >> p.age; cin.get();
cin.getline(p.firstname,20);
cin.getline(p.lastname,20);
Т.е. просто добавить cin.get(); после форматного ввода. Этот вызов сожрёт нежелательный символ перевода строки в буфере ввода.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости