@Muriam

Как в qt-creator вывести в консольном приложении русский текст вместо кракозябр (см картинка)?

5e82ccec13ac7687021204.png

#include <iostream>

#include <conio.h>

#include <locale>

#include <ctime>   //для таймера

#include <cstdlib> //для генерации рандомных чисел

#include <cstring>

#define SIZE 82000

using std::cout;
using std::endl;

int _array1[SIZE];
int _array2[SIZE];
int n = SIZE - 1;
long int time1;

void random_array(int * array);
long int insertion_sort(int * array);
void Merge(int * array, int first, int last); //слияние массивов
void merge_sort(int * array, int first, int last); //рекурсивная процедура сортировки

int main() {

  setlocale(LC_ALL, "rus");

  srand(time(0));

  random_array(_array1); //исходный массов
  //	cout << "\n\n";                      

  memcpy(_array2, _array1, sizeof(int) * SIZE); //копия исходного массова
  /*	cout << "копия исходного массива" << "\n";
  	for (int i = 0; i < SIZE; i++)
  	{
  		cout << _array2[i] << " ";
  	}
  	cout << "\n";
  ЗАКОММЕНТИРОВАНО, ЧТОБ ДОЛГО НЕ ЖДАТЬ ВЫВОД ОГРОМНОГО МАССИВА НА ЭКРАН */

  insertion_sort(_array1); //вызов сортировки вставками	
  /*	for (int i = 0; i < SIZE; i++)
  	{
  		cout << _array1[i] << " ";
  	}
  	cout << "\n";
  ЗАКОММЕНТИРОВАНО, ЧТОБ ДОЛГО НЕ ЖДАТЬ ВЫВОД ОГРОМНОГО МАССИВА НА ЭКРАН */

  //	cout << "\nотсортировано слиянием" << endl;
  merge_sort(_array2, 0, n); //вызов сортировки слиянием
  /*	for (int i = 0; i < SIZE; i++)
  	{
  		cout << _array2[i] << " ";
  	}
  	cout << "\n\n";
  ЗАКОММЕНТИРОВАНО, ЧТОБ ДОЛГО НЕ ЖДАТЬ ВЫВОД ОГРОМНОГО МАССИВА НА ЭКРАН */

  cout << "\n" << "при размере массива = " << SIZE << " элементов" << "\n";
  cout << "время работы сортировки вставками = " << time1 << " мсек" << "\n\n";

  getch();
  return 0;
}

void random_array(int * array) {
  //cout << "исходный массив" << endl;	
  for (int i = 0; i < SIZE; i++) {
    array[i] = rand() % 100;
    //cout << array[i] << " ";              ЗАКОММЕНТИРОВАНО, ЧТОБ ДОЛГО НЕ ЖДАТЬ ВЫВОД ОГРОМНОГО МАССИВА НА ЭКРАН 
  }

}

long int insertion_sort(int * array) {
  //	cout << "\nотсортировано вставками" << endl;

  long int start_time = clock(); // начальное время			//*************

  for (int i = 1; i < SIZE; i++) {
    const int temp = array[i];
    int j = i - 1;
    while (j >= 0 && temp < array[j]) {
      array[j + 1] = array[j];
      j--;
    }
    array[j + 1] = temp;
  }

  long int end_time = clock(); // конечное время				//*************
  time1 = end_time - start_time; // искомое время в мсек  		//*************
  //float time2 = (float)time1 / 1000;				// это в секундах				//*************

  return time1; //*************	
}

void Merge(int * array, int first, int last) {
  int middle, start, finall, j;

  int * mas = new int[SIZE];

  middle = (first + last) / 2; //вычисление среднего элемента
  start = first; //начало левой части
  finall = middle + 1; //начало правой части

  for (j = first; j <= last; j++) //выполнять от начала до конца
    if ((start <= middle) && ((finall > last) || (array[start] < array[finall]))) {
      mas[j] = array[start];
      start++;
    }
  else {
    mas[j] = array[finall];
    finall++;
  }

  //возвращение результата в список
  for (j = first; j <= last; j++)
    array[j] = mas[j];

  delete[] mas;
}

void merge_sort(int * array, int first, int last) {
  //cout << "\nотсортировано слиянием" << endl;
  {
    if (first < last) {
      merge_sort(array, first, (first + last) / 2); //сортировка левой части
      merge_sort(array, (first + last) / 2 + 1, last); //сортировка правой части
      Merge(array, first, last); //слияние двух частей
    }
  }
};
  • Вопрос задан
  • 4738 просмотров
Пригласить эксперта
Ответы на вопрос 1
dilepremon
@dilepremon
Студент-заочник, учусь, работаю
Хм, 3 минуты гугла и первая ссылка выдали это:

"Хотя уже давно разработан единый стандарт кодирования символов — Unicode, в Windows до сих пор используются несколько кодировочных таблиц, а именно — cp866, cp1251. Использование нескольких таблиц кодирования символов и является причиной появления козябликов, вместо кириллицы в консоли.

Так уж повелось, в командной строке Windows кодировка символов соответствует стандарту cp866. То есть все символы в командной строке Windows закодированы по кодировочной таблице cp866. Причём поменять кодировку в командной строке Windows нельзя. Просмотреть стандарт кодирования символов в консоли можно, с помощью команды GRAFTABL

Решить данную проблему можно только одним способом — перед тем, как передать текст в консоль, необходимо его перекодировать в стандарт кодирования символов cp866."

и это:

"Для ввода/вывода используйте текстовые потоки, для потока следует установить кодек, транслирующий текст в кодировку, применяемую в консоли. Поэтому для вашей системы имя кодека может быть и не "cp866". Приведенный ниже пример предполагает использование Qt 5, а кодировка исходного текста программы - UTF-8"

#include <QCoreApplication>
#include <QTextStream>
#include <QTextCodec>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QTextStream outStream(stdout);
    outStream.setCodec(QTextCodec::codecForName("cp866"));
    outStream << QString("Русский текст в консоли") << flush;
 
    return a.exec();
}


P.S. Если по какой-то причине не используются Qt библиотеки, имеется другой вариант в этой статье.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы