Индекс 6 находиться вне диапазона

Рейтинг: -2Ответов: 1Опубликовано: 25.01.2023

Пытаюсь сделать сортировку элементов и он крашится, искал в интернете,но ошибки, которые показывают у меня нет.

using namespace std;

#include <iostream>

int main()
{

const int number = 6;
char str[number] = { 'z','x','с','v','b','\0' };
char temp;
int a, b;
for (int i = 0; i < number;i++)
{ 
    for (int j = 0; j < number; j++)
    {
        a = (str[j]);
        b = (str[j + 1]);
        if (a > b)
        {
            temp = str[j];
            str[j] = str[j + 1];
            str[j + 1] = temp;

        }
    }
        

    
}
for (int i = 0; i < number; i++)
{
    cout << str[i] << " ";
}
return 0;
}

Ответы

▲ 1

Ошибка, как и написал wololo - у вас выход за пределы массива при j==5 в операции b = (str[j + 1]). Т.е. внутренний цикл должен быть for( ; j < number-1; )
Ещё одна возможная логическая ошибка - вы сортируете по возрастанию символьный массив. А в нем символ \0 является специальным (служебным) - обозначающим конец строки в стандарте c, а не значимым символом этой строки. Вряд ли логически он должен участвовать в сортировке. И если вы попытаетесь после сортировки вывести массив как строку cout << str; - то ноль на первом месте закончит вывод так и не начав его.
А ещё вашу пузырьковую сортировку можно немного улучшить. Сейчас вы делаете n*n операций.
При каждом выполнении внутреннего цикла у вас максимальный элемент в массиве перемещается на последнее место. Поэтому на следующем шаге его можно больше не сравнивать. Для этого внешний цикл нужно сделать на убывание, а условие внутреннего цикла - до i.

int main()
{
    const int number = 6;
    char str[number] = { "zxcvb" };
    int size = number - 1; // убираем служебный 0 из сортировки

    cout << str << endl; // вывод строки до сортировки

    for (int i = size-1; i > 0; i--)
        for (int j = 0; j < i; j++)
            if (str[j] > str[j + 1])
                swap( str[j], str[j + 1] );

    cout << str << endl; // вывод строки после сортировки
}