Индекс 6 находиться вне диапазона
Пытаюсь сделать сортировку элементов и он крашится, искал в интернете,но ошибки, которые показывают у меня нет.
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; // вывод строки после сортировки
}