@kostyakos52000
student

Что не так с кодом? Как правильно делать?

Задача состоит в том, чтобы ввести данные на русском языке. Вопрос в том, как это правильно делать, и почему происходит ошибка(см. изображения).
проблемная область кода:
#include <iostream>

using namespace std;

const unsigned int arr_size = 2; // array size
const unsigned int str_len = 80;
int i;

struct marsh {
	char start[str_len];
	char finish[str_len];
	unsigned int index;
} list[arr_size];


int main() {
	setlocale(LC_ALL, "Rus");

	// input
	for (i = 0; i < arr_size; i++)
	{
		cout << "====================================" << endl
			<< "\tдобавление записи " << i + 1 << endl
			<< "номер маршрута = ";
		cin >> list[i].index;
		cout << "начальный пункт = ";
		cin.getline(list[i].start, str_len);
		cout << "конечный пункт = ";
		cin.getline(list[i].finish, str_len);
	}
	cout << "====================================" << endl;
}
изображение результата при запуске

снимок1
5c72c9ce82d26056610407.jpeg
снимок2
5c72cb0b551a4934321289.jpeg
полный код программы
#include <iostream>

using namespace std;

const unsigned int arr_size = 2; // array size
const unsigned int str_len = 80;
int i;

struct marsh {
	char start[str_len];
	char finish[str_len];
	unsigned int index;
} list[arr_size];


int main() {
	setlocale(LC_ALL, "Rus");

	// input
	for (i = 0; i < arr_size; i++)
	{
		cout << "====================================" << endl
			<< "\tдобавление записи " << i + 1 << endl
			<< "номер маршрута = ";
		cin >> list[i].index;
		cout << "начальный пункт = ";
		cin.getline(list[i].start, str_len);
		cout << "конечный пункт = ";
		cin.getline(list[i].finish, str_len);
	}
	cout << "====================================" << endl;
	//sorting
	marsh temp;
	for (i = 0; i < arr_size - 1; i++)
		for (int j = 0; j < arr_size - i - 1; j++)
			if (list[j].index > list[j + 1].index) {
				temp = list[j];
				list[j] = list[j + 1];
				list[j + 1] = temp;
			}
	// output
	unsigned int number;
	cout << endl << "введите номер маршрута, который хотите просмотреть" << endl
		<< "номер = ";
	cin >> number;
	bool not_in_list = true;
	for (i = 0; i < arr_size; i++)
	{
		if (list[i].index == number)
		{
			cout << "\nмаршрут номер " << list[i].index << " из начального пункта \"" << list[i].start
				<< "\" в конечный пункт \"" << list[i].finish << '\"' << endl << endl << endl;
			not_in_list = false;
			break;
		}
	}
	if (not_in_list) cout << "извините, но данного маршрута в записях нет" << endl << endl << endl;
	system("Pause");
	return 0;
}
P. S. в общем интересно узнать мнение о коде, так что если не лень отпишите пожалуйста, насколько всё плохо.

как вводить русский текст на windows 10 без использования windows.h?
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
@res2001
Developer, ex-admin
Кодировка консоли в винде по умолчанию cp866 (а не 1251 как многие думают). Но можно переключить.
Для простоты сохраните ваши исходники в 866 кодировке.
setlocale работает только на вывод. Для ввода используйте cout.imbue.

Переключать кодировку консоли из утилиты - дурной тон. Для студенческой лабы это еще терпимо, но нормальная русская консольная утилита должна уметь правильно выводить текст не зависимо от того какая кодировка установлена в консоли 866 или 1251. Например, почти все родные виндовые консольные утилиты с этим справляются успешно.

По уму делать примерно по следующей схеме:
1.Исходники в UTF8
2.Все строковые константы с префиксом L"string"
3.Строки хранить в wchar_t
4.Определять кодировку консоли для ввода и вывода и перекодировать свои юникодные строки в нужную кодировку и только потом выводить или после ввода перекодировать в UTF8. Для перекодирования в WinAPI все есть, но без windows.h не обойтись.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kostyakos52000 Автор вопроса
student
К ответу выше прилагаю исправленный код (Не идеален, но на поставленный вопрос отвечает. Возможно это кто-то прочтёт и кому-то пригодится). Спасибо за ответ.
код
#include <iostream>

using namespace std;

const unsigned int arr_size = 10; // array size
const unsigned int str_len = 80;
int i;

struct marsh {
	wchar_t start[str_len];
	wchar_t finish[str_len];
	unsigned int index;
} notes[arr_size];

int main() {
	wcin.imbue(locale(".866"));
	wcout.imbue(locale(".866"));

	// input
	for (i = 0; i < arr_size; i++)
	{
		wcout << L"====================================" << endl
			<< L"\tдобавление записи " << i + 1 << endl
			<< L"номер маршрута = ";
		cin >> notes[i].index;
		wcout << L"начальный пункт = ";
		wcin.ignore();
		wcin.getline(notes[i].start, str_len);
		wcout << L"конечный пункт = ";
		wcin.getline(notes[i].finish, str_len);
	}
	wcout << L"====================================" << endl;
	//sorting
	marsh temp;
	for (i = 0; i < arr_size - 1; i++)
		for (unsigned int j = 0; j < arr_size - i - 1; j++)
			if (notes[j].index > notes[j + 1].index) {
				temp = notes[j];
				notes[j] = notes[j + 1];
				notes[j + 1] = temp;
			}
	// output
	unsigned int number;
	wcout << endl << L"введите номер маршрута, который хотите просмотреть" << endl
		<< L"номер = ";
	cin >> number;
	bool not_in_notes = true;
	for (i = 0; i < arr_size; i++)
	{
		if (notes[i].index == number)
		{
			wcout << L"\nмаршрут номер " << notes[i].index << L" из начального пункта \"" << notes[i].start
				<< L"\" в конечный пункт \"" << notes[i].finish << '\"' << endl << endl << endl;
			not_in_notes = false;
			break;
		}
	}
	if (not_in_notes) wcout << L"извините, но данного маршрута в записях нет" << endl << endl << endl;
	system("Pause");
	return 0;
}

скриншоты результатов
5c73007a27e9e777849309.jpeg
Ответ написан
Ваш ответ на вопрос

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

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