Сортировка массива символов с помощью указателей, не могу найти проблему в программе, в которой она есть

Ниже приведен код + пример ввода/вывода строки должны быть отсортированы по алфавиту от А до Я.

Так же не понимаю, от куда берется мусор в конце каждой строки, вроде каждый раз выделяю только нужное кол-во памяти для строк в массиве

#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)В сортировке были допущены две ошибки:

  1. !exchange меняем на exchange == false
  2. Добавить условие на прерывание цикла
// Сортировка
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;
        }
    }
}
→ Ссылка