int main()
{
std::string str; //С++ строка
size_t beg = 0, end, max_len = 0, max_pos = 0, max_num = 0, number = 1;
std::getline(std::cin, str); //считывание строки
do
{
end = str.find_first_of(' ', beg); //нахождение позиции следующего пробела
if (end == std::string::npos) end = str.size(); //если пробела не найдено = позиция конца строки
if (end - beg > max_len) //если разница между пробелами больше длины макс слова
{
max_len = end - beg; //обновить длину
max_pos = beg; //обновить его индекс
max_num = number; //обновить порядковый номер
}
beg = end + 1; //сдвигаем позицию поиска за последний пробел
++number; //счетчик слов
} while (end != str.size()); //цикл идет пока не достигли конца строки
std::cout
Ошибка как минимум здесь s[i-1]. На первом такте цикла выйдете за пределы строки. А так задачу можно решить через один основной цикл. В нём нужно сравнивать пары соседних символов и в зависимости от их содержимого ("пробел - не пробел", "не пробел - не пробел", "пробел - пробел" либо подсчитывать буквы в слове, либо, если слово закончилось, искать максимум и запоминать позицию в отдельную переменную. Скорее всего будут частные случаи с первым и последним символом в строке.