Удаление строк заполненных только пробелами

Нужно реализовать массив структур, при этом поля, заполненные только пробелами, будут удалятся. Идея состоит в том, чтобы через функцию .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

→ Ссылка