Удаление строк заполненных только пробелами
Нужно реализовать массив структур, при этом поля, заполненные только пробелами, будут удалятся. Идея состоит в том, чтобы через функцию .length() узнать длину строки, создать строку пробелов этой длины и проверять каждый элемент строки. Если элемент = пробелу, то повысить счетчик на 1. Если счетчик равен длине строки, то это значит, что строка заполнена только пробелами и ее нужно удалить(это я пока не делал). Только у меня возникли проблемы с реализацией, а именно функция .length() не возвращает длину строки. Пожалуйста, укажите на ошибки или как еще можно это реализовать.
#include <iostream>
#include <string>
using namespace std;
struct Institute
{
string name;
string adress;
};
int main()
{
int size;
cin >> size;
Institute *institute = new Institute[size];
for (int i = 0; i < size; i++) {
string a; string b;
cout << "Enter name #" << i+1 << endl;
getline(cin, a);
cin.ignore();
cout << "Enter adress #" <<i+1<< endl;
getline(cin, b);
cin.ignore();
institute[i].name = a;
institute[i].adress = b;
}
int counter = 0;
for (int i = 0; i < size; i++) {
for (int j = 0; j < institute[i].name.length(); j++) {
string space = ((institute[i].name.length()), " ");
// cout << institute[i].name.length() << endl;
if (institute[i].name[j] == space[j])
counter++;
}
cout << counter << endl;
}
delete[] institute;
}
Ответы (1 шт):
У вас после cin >> size в буффере остается символ новой строки (можете это проверить char x = cin.get()) функция getline начинает считывать строку и сразу попадает на символ новой строки, по этому строка a пустая. getline откидывает \n. Потом игнорируется первая буква имени и остальная часть уже вноситься в b.
Вам нужно проигнорировать символ новой строки после cin >> size, а после функций getline не требуется использовать cin.ignore()
Вот пример измененного участка кода:
int size;
cin >> size;
cin.ignore();
Institute* institute = new Institute[size];
for (int i = 0; i < size; i++) {
string a; string b;
cout << "Enter name #" << i + 1 << endl;
getline(cin, a);
cout << "Enter adress #" << i + 1 << endl;
getline(cin, b);
institute[i].name = a;
institute[i].adress = b;
}
Тут можете почитать, что символ разделитель отбрасывается. В вашем случае это \n