Сортировка массива символов с помощью указателей, не могу найти проблему в программе, в которой она есть
Ниже приведен код + пример ввода/вывода строки должны быть отсортированы по алфавиту от А до Я.
Так же не понимаю, от куда берется мусор в конце каждой строки, вроде каждый раз выделяю только нужное кол-во памяти для строк в массиве
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
// Заполнение массивов
int n;
cin >> n;
cin.ignore();
char** cBuffer = new char* [n];
char** cPointers = new char* [n];
char symbol = ' ';
string stroka;
int count = 0;
for (int i = 0; i < n; ++i) {
if (symbol != '*') {
count++;
symbol = ' ';
stroka = "";
bool first = false;
while (symbol != '#' && symbol != '*') {
symbol = getchar();
if (symbol != '#' && symbol != '*' && first) {
stroka += symbol;
}
if (!first) {
stroka = symbol;
first = true;
}
}
cBuffer[i] = new char[size(stroka)];
for (int j = 0; j < stroka.size(); ++j) {
cBuffer[i][j] = stroka[j];
}
cPointers[i] = &cBuffer[i][0];
}
cPointers[i] = NULL;
}
// Вывод
for (int i = 0; i < count; ++i) {
cout << cPointers[i] << endl;
}
cout << "\n\n";
// Сортировка
for (int k = 0; k < count - 1; ++k) {
for (int i = 0; i < count - 1; ++i)
{
bool exchange = false;
for (int j = 0; j < (sizeof(cPointers[i]) / sizeof(cPointers[i][0])); ++j)
{
if (static_cast<int>(cPointers[i][j]) > static_cast<int>(cPointers[i + 1][j]) && !exchange)
{
char* temp = cPointers[i + 1];
cPointers[i + 1] = cPointers[i];
cPointers[i] = temp;
exchange = true;
}
}
}
}
// Вывод отсортированного массива
for (int i = 0; i < count; i++) {
cout << cPointers[i] << endl;
}
return 0;
}
Пример:
Ввод: Hello World!#How are you?#Are you at home?#Call me if you love me!!#Borring morning!*
Вывод:
Hello World!¤¤¤¤
How are you?¤¤¤¤
Are you at home?¤¤¤¤▌▌▌▌▀=▌
Call me if you love me!!¤¤¤¤
Borring morning!¤¤¤¤
Borring morning!¤¤¤¤
Hello World!¤¤¤¤
How are you?¤¤¤¤
Are you at home?¤¤¤¤▌▌▌▌▀=▌
Call me if you love me!!¤¤¤¤
Ответы (1 шт):
Автор решения: Kreker
→ Ссылка
Прошу не критиковать ответ строго
Исправленные части кода:
1)Мусор в конце строк:
Как и сказал @Ddd, нужно копировать завершающий символ, соответственно, нужно увеличить длину массива на один.
cBuffer[i] = new char[size(stroka) + 1];
for (int j = 0; j <= stroka.size(); ++j) {
cBuffer[i][j] = stroka[j];
}
2)В сортировке были допущены две ошибки:
!exchangeменяем наexchange == false- Добавить условие на прерывание цикла
// Сортировка
for (int k = 0; k < count - 1; ++k) {
for (int i = 0; i < count - 1; ++i)
{
bool exchange = false;
for (int j = 0; j < (sizeof(cPointers[i]) / sizeof(cPointers[i][0])); ++j)
{
if (static_cast<int>(cPointers[i][j]) > static_cast<int>(cPointers[i + 1][j]) && exchange == false)
{
std::swap(cPointers[i], cPointers[i + 1]);
exchange = true;
}
else if (static_cast<int>(cPointers[i][j]) < static_cast<int>(cPointers[i + 1][j]) || exchange == true) break;
}
}
}