Задано предложение, состоящее из слов-строк. Написать программу, которая находит самое короткое слово в предложении

Задано предложение, состоящее из слов-строк. Написать программу, которая находит самое короткое слово в предложении.

Не понимаю, почему программа пишет самое первое слово и вообще не находит короткого слова.

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

int main()
{
    string n;
    int count = 0;
    int s;
    int min = INT_MAX;
    int min_i = 0;
    getline(cin, n);
    for (int i = 0; i < n.size(); i++) {
        count++;
        if (isspace(n[i])) {
            if (count < min) {
                min = count;
                min_i = i;
            }
            count = 0;
        }
    }
    for (int i = min - min_i - 1; i < min; i++) {
        cout << n[i];
    }
}

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

Автор решения: Стас

Я исправил ваш код, оставил в нём комментарии с объяснением. И ещё - в строку нужно вводить символы на латинице, русский она не воспринимает (или переводить строку в правильную кодировку и пользоваться русским).

#include <iostream>
using namespace std;

int main(){
    setlocale(LC_ALL, "Russian");
    string n;
    int count = 0, min = INT_MAX, min_i = 0;
    getline(cin, n);
    n += " "; //я добавил пробел, т.к. вы проверяете на наличие пробела в строке, и, когда доходит до последнего слова -
    // - пробела там нет и оно просто не учитывается
    for (int i = 0; i < n.length(); i++){
        if (isspace(n[i])){
            if (count < min) {
                min = count;
                min_i = i;
            }
            count = -1; //переместил count++ вниз цикла, иначе проверка начинается со 2го символа,
            // и чтобы расчёты остались верными нужно его уменьшить на один
            // (при следующем запуске цикла отсчёт начнется неправильно без -1)
        }
        count++;
    }
    cout << "Длина самого короткого слова равна " << min << endl;
    int i = min_i - min; // сделал по другому расчёт мин индекса
    // у вас минимальный индекс ставится в конце слова, и из-за этого был неправильный вывод.
    //Раз мин индекс в конце слова - начало этого слова это мин индекс - длина, а длина это min.
    cout << "Это слово ";
    while (!isspace(n[i])){ //и здесь вывод начинается с начала самого короткого слова,
        // и до его конца, т.е. - пробела
        cout << n[i];
        i++;
    }
}
→ Ссылка