Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Вывод русских символов в консоль


Автор: Mastodont 31.3.2010, 19:14
Чтобы выводить русские буквы в консоли, написал функцию rustext()

Код

#include<iostream>
using namespace std;

#include<windows>

char rustext(char str)
{
   char buffer[1024];
   CharToOem(str, buffer);
   return buffer;
}

int main()
{
   cout << rustext("Строка") << endl;

   system("pause");
   return 0;
}


Но компилятор ругается
Цитата

[C++ Error] Unit1.cpp(9): E2034 Cannot convert 'int' to 'const char *'

return может использоваться только в int-функции?

Цитата

[C++ Error] Unit1.cpp(9): E2342 Type mismatch in parameter 'lpszSrc' (wanted 'const char *', got 'char')

Почему константа? ведь слова const я нигде не ставил. Наверное, "*" несет еще какуюто смысловую нагрузку?

Цитата

[C++ Warning] Unit1.cpp(10): W8075 Suspicious pointer conversion

Suspicious pointer conversion - подозрительный указатель преобразования, как я понял. Что это означает?

Цитата

[C++ Error] Unit1.cpp(10): E2034 Cannot convert 'char *' to 'char'

А здесь он что пытается преобразовать?

Цитата

[C++ Error] Unit1.cpp(15): E2342 Type mismatch in parameter 'str' (wanted 'char', got 'char *')

Несовпадение типа в параметре 'str'. А почему несовпадение? Везде ж char. Или здесь что-то другое имеется в виду?

Может, есть более удачный вариант решения моего вопроса?

Автор: KelTron 31.3.2010, 19:23
Код

char* rustext(char* str)
{
   char buffer[1024];
   CharToOem(str, buffer);
   return buffer;
}

Можно и без буффера:
Код

char* rustext(char* str)
{
   CharToOem(str, str);
   return str;
}

Автор: ИванМ 31.3.2010, 19:28
Цитата(KelTron @  31.3.2010,  19:23 Найти цитируемый пост)
char* rustext(char* str)
{
   char buffer[1024];
   CharToOem(str, buffer);
   return buffer;
}

так нельзя делать. buffer локальный массив.

Автор: KelTron 31.3.2010, 19:41
Цитата(ИванМ @  31.3.2010,  19:28 Найти цитируемый пост)
так нельзя делать. buffer локальный массив.

Ты прав, я на это не обратил внимания...

Добавлено через 11 минут и 57 секунд
Что то я уже сплю, оба варианта некорректны, вот правильный:
Код

char* rustext(char* str)
{
    char* buf = new char[strlen(str) + 1];
    CharToOemA(str, buf);
    return buf;
}

Автор: borisbn 31.3.2010, 20:07
http://msdn.microsoft.com/ru-ru/library/x99tb11d.aspx
тема уже тысячу раз обсуждалась

Автор: ИванМ 31.3.2010, 20:11
borisbn, setlocale в билдере не работает. По крайней мере, в 6м.

Автор: borisbn 31.3.2010, 21:23
ИванМ, как бы сказал Якубович: код в студию smile
P.S. под студией имеется ввиду не visual studio, а vingrad
на p.s. просьба не отвечать - шутю я так smile
P.P.S. В каждой шутке есть доля шутки smile

Автор: ИванМ 31.3.2010, 21:55
borisbn, имеете ввиду показать как я пишу setlocale? Или показать как работает перекодировка в билдере?

Автор: borisbn 31.3.2010, 22:11
ИванМ, конечно первое

Автор: ИванМ 31.3.2010, 22:15
ну например:
setlocale(LC_ALL, "Russian.1251")
setlocale(LC_ALL, "Russian_Russia.1251")
setlocale(LC_ALL, ".1251")
setlocale(LC_ALL, "Russian")

Автор: borisbn 1.4.2010, 08:59
ИванМ, bag your pardon, прошлый пост писал дома (там builder не установлен). сейчас проверил - не работает setlocale, причём GetLastError возвращает ERROR_ENVVAR_NOT_FOUND (The system could not find the environment option that was entered). Может для builder'а нужно какие-то environment переменные завести ?
Код

#define __USELOCALES__
#include <stdio.h>
#include <locale>
#include <windows.h>
int main( int argc, char* argv[])
{
    char* strings[] = { "Russian.1251", "Russian_Russia.1251", ".1251", "Russian" };
    int lastError = 0;
    for ( int i = 0; i < 4; i++ )
    {
        std::setlocale( LC_ALL, strings[ i ] );
        lastError = GetLastError();
        if ( lastError )
        {
            printf( "%s - lastError = %d\n", strings[ i ], lastError );
        }
    }
    return 0;
}

выдаёт следующее:
Код

Russian.1251 - lastError = 203
Russian_Russia.1251 - lastError = 203
.1251 - lastError = 87
Russian - lastError = 87

Автор: mrbrooks 1.4.2010, 09:04
Сам вопрос боянистей не куда. Вплоть до 2009 - Билдер относился как к setlocale, так и к более кошерному std::locale, сугубо отрицательно.
Хотя грешить только на Билдер не стоит - многие компиляторы без бубна так же оказываются так запросто выводить русский язык. Хотя в студии вопрос решается на ура.

Автор: DCamer 1.4.2010, 12:15
http://forum.vingrad.ru/forum/topic-295469.html

Автор: ИванМ 1.4.2010, 15:34
В студии тоже не все ура. Ставишь локаль, он работает нормально на вывод и в консоль и в файл. Но если например ввести русское слово и его потом попытаться вывести, то опять будут крокозябры. Но, я думаю, тут дело скорее в самой винде. По другому никак.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)