Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2014, 23:44   #1
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию Русские буквы в консоле С++

помогите написать функцию для печати русских символов в консоле, моя не всегда работает с классами, делал поиск по русских символов по таблице, которая выводится моим кодом, сам символ находится верно, но функция не срабатывает(закомментированный код). Подскажите как лучше это всё реализовать?(использую RAD STUDIO XE3)

Код:
#include <iostream.h>
#include <string.h>

char* rus(char* );


void main(){
int N;
char text[] = "А Я";
char T;

//показать таблицу символов
signed char test1;
for (int i= -128; i <= 127; i++) {
	test1 = i;
	cout << i << " : " << test1 << "  ";
	if (i % 10 == 0) {
		cout << endl;
		}
	}
cout << endl << endl << endl;

//показаь таблицу символов по массиву text
for (int i = 0; i <= strlen(text); i++) {
	N = text[i];
	T = text[i];
	cout << N << " : " << T << "    ";
}
cout << sizeof(text) << endl;

//проверка функции
cout << "test : "<< rus("АБВГДЕЖЗИЙК") << "  " << rus(text) << endl;
cin.get();//чтоб программа не закрылась
}

char* rus(char *text){
//int N;
//cout << endl;
 for (int i = 0; text[i] != '\0'; i++) {
	if (text[i] == ' ') {//если пробел то ничего не делать
		continue;
		}
	text[i]-=64;
//  N = text[i];
//  cout << N;
//  if (text[i] < 0){//(-32) || text[i] > (-65)) {//по идее в этом диапазоне русские заглавные буквы
//	text[i] - 64;
//	}
  }
//  cout << endl;
// cout << sizeof(text);
 return text;
}
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 04.07.2014, 01:07   #2
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

как насчет перейти с char на wchar_t?
imho это самый легкий путь
Zenon вне форума Ответить с цитированием
Старый 04.07.2014, 09:11   #3
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

я изучаю с++ по старой книге и ничего про wchar_t не слышал, но дело не в этом, я пробовал обрабатывать русские символы по их коду

Код:
char* rus(char *text){
int N;
 for (int i = 0; text[i] != '\0'; i++) {
  N = text[i];
  cout << N;
  if (-65 < text[i] && text[i] < -32) {//по идее в этом диапазоне русские заглавные буквы
	text[i] - 64;
	}
  }
 return text;
}
в N записывается код символа, этот код отображается на экран. В диапазоне от -32 до -65 находятся заглавные буквы А-Я , но конструкция if не срабатывает на эти коды. Вопрос, почему if не срабатывает на нужные коды символов?
П.С. предыдущий способ реализации функции менее универсальный(нельзя использовать числа и знаки препинания).
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 04.07.2014, 09:51   #4
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

всё заработало вот так:

Код:
char* rus(char *text){
int N;
 for (int i = 0; text[i] != '\0'; i++) {
  N = text[i];
  if (N < (-32) && N > (-65))  {
	text[i] -= 64;
	}
  }
 return text;
}
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 04.07.2014, 10:33   #5
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

0. У вас там в одном месте
Код:
text[i] - 64
, т.е. результат вычитания никуда не передается. Надо
Код:
text[i] -= 64
.

1. Почему именно 64? Если вы на нормальном Windows, то заглавные русские буквы имеют коды -64...-33, строчные русские буквы имеют коды -32..-1, буквы ё и Ё имеют коды -72, -88. Если вы будете вычитать 64 из -64...-33, то будете получать коды -128...-97 - это всякая псевдографика.

2. Конструкция cout << N работает по-разному в зависимости от типа N. В вашем случае N целое и эта строчка напечатает код символа цифрами, а не сам символ. Если хотите печатать символ, то надо
Код:
count << (char)N
.

3. По-умолчанию в консольных C/C++ программах действует кодировка "C". Эта кодировка позволяет печатать символы с кодами 0..127, а для символов с другими кодами (как у вас) результат печати неопределен. В зависимости от расположения звёзд там могут получаться русские буквы, но с другими кодами.

Поэтому перед печатью вам надо сменить кодировку на ту самую, в которой есть русские буквы и русские буквы имеют те самые коды, вот так:

Код:
setlocale(LC_CTYPE, ".1251");
Подробнее см. функцию setlocale.
Zenon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Русские символы в консоле pimple2006 Общие вопросы Delphi 2 16.12.2011 10:50
Русские буквы в case YourLastSong Общие вопросы C/C++ 2 05.05.2011 17:50
Русские буквы morgan97 Паскаль, Turbo Pascal, PascalABC.NET 4 10.03.2011 10:15
Как в Qt в консоле отображать русские буквы? Lemo Помощь студентам 0 05.10.2010 14:53