@nishe

Почему некорректно выводит русские символы, только которые выводятся с помощью printf() в цикле for()?

Я написал код, который сортирует строки относительно первого символа в строке. Код прекрасно работает с латиницей, и выводит отсортированные строки, но вывод символов кириллицы происходит неправильно.
Это странно, учитывая то, что print'ы которые находятся вне цикла for(), выводят кириллицу нормально.
#include <stdio.h>
#include <locale.h>
#include <iostream>
#include <string>







int main() {

    setlocale(LC_ALL, "Rus");
    char** A = NULL;
    bool sorted_a_to_z;
    int count = 0;
    std::string quit_condition = "";
    printf("Для завершения ввода строка введите Enter\n");

    do {
        
        A = (char**)realloc(A, ++count * sizeof(char*));
        *(A+count-1) = (char*)malloc(100 * sizeof(char));
        std::cin.getline(*(A+count-1), 100);
        
    } while (*(A+count-1) != quit_condition);
  

    printf("Ввод строк окончен\n\n");
    
    int checker = 0;

    while (checker != count - 2)
    {
        for (int i = 0; i < count - 2; i++) {
            
            if (**(A + i) >= **(A + i + 1))
            {
                std::swap(*(A + i), *(A + i + 1));
            }
        }
        checker = 0;
        for (int i = 0; i < count - 2; i++)
        {
            sorted_a_to_z = (A[i][0] <= A[i + 1][0]);
            if (sorted_a_to_z)
            {
                checker++;
            }
        }
    }
    printf("Отсортированный список строк:\n\n");
    for (int i = 0; i < count-1; i++)
    {
        printf("%s\n",A[i]);
    }
    
    return 0;

}

Думаю есть два варианта развития событий:
1)"Посимвольное сравнение" кириллицы работает по немного иным принципам, следовательно код юзабелен только для латиницы.
2) Проблема все-таки конкретно в выводе кириллицы.
Прошу вас помочь мне с этим разобраться. Ну и отметить так же другие ошибки.
Пример входных-выходных данных для латиницы:
Для завершения ввода строка введите Enter
zero
big
apple
drow

Ввод строк окончен

Отсортированный список строк:

apple
big
drow
zero

Пример входных-выходных данных для кириллицы:
Для завершения ввода строка введите Enter
яблоко
атом
берег
вода

Ввод строк окончен

Отсортированный список строк:

 вR┐
Ў?а??
ўR¤ 
пЎ<RЄR
  • Вопрос задан
  • 413 просмотров
Пригласить эксперта
Ответы на вопрос 1
@FoxOne
Очень рекомендую автору ознакомится с такой непростой темой как locale aware comparison
Почитайте про сишный strcoll или плюсовый std::collate, а то у вас как-то по-простому **(A + i) >= **(A + i + 1)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы