Не могу понять, почему цикл for не захватывает последнее слово строки

#include <string>
#include<set>
using namespace std;

int main() {
    string s;
    int a{ 0 },tp{ 0 },v{ 0 };
    string n{""},b{""};
    
    getline(cin, s);
    for(auto c:s) {
        a++;
    }

    for (int i = 0; i <= a; i++) {
        tp++;
        n = n + s[i];

        if (s[i] == ' ') {
         cout << n << endl;
            if (tp > v) {
                v = tp;
                b = n;
            }
            tp = 0;
            n = "";
        }
    }

    cout << b;
    return 0;
}

Ответы (2 шт):

Автор решения: cock

Тут неопределенное поведение в s[i] при i == a.

→ Ссылка
Автор решения: Harry

Потому что последним символом строки может не быть пробел, и if (s[i] == ' ') не сработает на последнем слове.

Если уж так хочется посимвольно слова собирать - то

int main()
{
    string s, n;
    if (getline(cin, s))
    {
        for (int i = 0; i < s.size(); i++)
        {
            if (s[i] == ' ')
            {
                if (n.size()) { cout << n << endl; n.clear(); }
            }
            else n += s[i];
        }

        if (n.size()) cout << n << endl;
    }
}

Но можно и короче -

string s;
if (getline(cin, s))
{
    istringstream ss(s);
    for(string n; ss >> n;) cout << n << endl;
}
→ Ссылка