Консоль зависает при выполнении

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

int main(){
    char str[20]="0000011100111100011";
    int n = strlen(str);
    int count = 0;
    int max = 0;
    for (int i = 0; i < n; i++) {
        while (str[i] == str[i + 1]) {
            count++;
        }
        if (count > max) {
            max = count;
        }
    }
    cout << max;
    return 0;
}

суть задания: Дана строка, состоящая из групп нулей и единиц. Подсчитать количество символов в самой длинной группе.


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

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

вам надо while поменять на if.

#include <iostream>
#include <string>

using namespace std;

int main(){
    char str[20]="0000011100111100011";
    int len = strlen(str);
    int count = 0;
    int max = 0;
    int n = str[0];
    
    for (int i = 0; i < len; i++){
        if (n != str[i]){
            if (count > max) max = count;
            count = 0;
            n = str[i];
        }
        count++;
    }
    cout << max;
    return 0;
}

пример с использованием цикла while

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

int main(){
    char str[20]="0000011100111100011";
    int len = strlen(str);
    int count = 0;
    int max = 0;
    int n = str[0];
    for (int i = 0; i < len; i++) {
        while (n == str[i]) {
            count++;
            i++;
        }
        if (count > max) {
            max = count;
        }
        count = 0;
        n = str[i];
    }
    cout << max;
    return 0;
} 
→ Ссылка
Автор решения: n1tr0xs

Ваша ключевая ошибка здесь:

while (str[i] == str[i + 1]) {
    count++;
}

В этом цикле вы не изменяете i, из-за чего программа входит в бесконечный цикл.

Вы можете сделать это так (минимальные изменения в вашем коде):

int main(){
    char str[20]="0000011100111100011";
    int n = strlen(str);
    int count = 1; // начальную длину установим в 1
    int max = 0;
    for (int i = 0; i < n; i++) {
        while (str[i] == str[i + 1]) {
            count++;
            ++i; // Вот здесь мы увеличим i
        }
        if (count > max) {
            max = count;
        }
        count = 1; // "Обнулим" длину для новой последовательности
    }
    cout << max;
    return 0;
}

Или можно так (более оптимально):

int main(){
    string str = "0000011100111100011";
    int n = str.length();
    int i = -1;
    int maximum = 1;
    while(++i < n){
        int counter = 1;
        while (str[i] == str[++i])
            ++counter;
        if (counter > maximum)
            maximum = counter;
    }
    cout << maximum;
    return 0;
}
→ Ссылка