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


Автор: sasha962 22.12.2007, 14:52
Когда я печатаю в коде программы русские буквы, то при выполнении программы командная строка выдаёт иероглифы. 

Автор: DigitSphinx 22.12.2007, 14:54
потому что кодировка другая, тебе нужны 2 функции
Код

BOOL CharToOem(      

    LPCTSTR lpszSrc,
    LPSTR lpszDst
);
BOOL OemToChar(      

    LPCSTR lpszSrc,
    LPTSTR lpszDst
);


Автор: sasha962 22.12.2007, 15:00
А что их нужно в код программы включить? 
smile 

Автор: DigitSphinx 22.12.2007, 15:09
Код

char * str = "Пример\n";
cout << str;
char * buf = new char [sizeof(str)];
CharToOem(str, buf);
cout << buf;


Добавлено через 1 минуту и 11 секунд
Цитата(sasha962 @  22.12.2007,  15:00 Найти цитируемый пост)
А что их нужно в код программы включить?

это функции их не включают в код а используют !

Добавлено через 3 минуты и 42 секунды
и не забудь подключить <windows.h>

Автор: sasha962 22.12.2007, 15:16
Но компилятор выдаёт ошибку.
А приведите пожалуйста полный код программы.

Автор: DigitSphinx 22.12.2007, 15:17
Цитата(DigitSphinx @  22.12.2007,  15:09 Найти цитируемый пост)
и не забудь подключить <windows.h>


Добавлено через 46 секунд
и ВСЕГДА цитируй компилятор (на что он ругается)

Добавлено через 4 минуты и 33 секунды
Код

#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    char * str = "Пример\n";
    cout << str;
    char * buf = new char [sizeof(str)];
    CharToOem(str, buf);
    cout << buf;
    return 0;
}


 

Автор: sasha962 22.12.2007, 15:22
Слово пример выводится, но перед этим словом тоже иероглифы.

Автор: DigitSphinx 22.12.2007, 15:24
smile  smile 
так я специально вывел слово «пример» до его преобразования и после !!!!!
 smile

Добавлено через 54 секунды
и не корчь мне злые рожи  smile 

Автор: sasha962 22.12.2007, 15:26
А теперь такая ошибка:
Цитата

1 D:\Dev-Cpp\main.cpp stdafx.h: No such file or directory. 

Автор: DigitSphinx 22.12.2007, 15:27
потому что у нас разные компиляторы, удали эту строку !
тебе осталось :
1 - поставить мне плюсик  smile 
2 - пометить тему как решенную   smile 
 smile 

Автор: DragoonFighter 22.12.2007, 18:24
Знаю, тема уже решена, но все это можно сделать гораздо проще! 

Функция:
Код

void RusOut(char *Str)
{
unsigned char c;
for(int i=0;Str[i]!='\0';i++)
  {
  c=Str[i];
  if(c>127)
    {
    if(c<240)c-=64;
    else     c-=16;
    }
  cout<<c;
  }
}


Приминение:
Код

RusOut("Тут пишем все что хотим!\n");



Автор: DigitSphinx 22.12.2007, 18:37
что то слишком заморочено и не полно !
Код

char * ToRus(char * str)
{
    char * buf = new char [sizeof(str)];
    CharToOem(str, buf);
    return buf;
}

Код

cout << ToRus("Test\nПример\n");
printf(ToRus("Test\nПример\n"));

Автор: DragoonFighter 22.12.2007, 19:41
Цитата(DigitSphinx @  22.12.2007,  18:37 Найти цитируемый пост)
что то слишком заморочено и не полно !


Да вот не до конца скопировал... теперь полный!

Автор: mdbr 18.3.2008, 09:23
Кто-нибудь может пожалуйста объяснить как работает код DragoonFighter'a?
Код

void RusOut(char *Str)
{
unsigned char c;
for(int i=0;Str[i]!='\0';i++)
  {
  c=Str[i];
  if(c>127)
    {
    if(c<240)c-=64;
    else     c-=16;
    }
  cout<<c;
  }
}

Понравилось тем что не надо подключать дополнительные заголовочные файлы, но я не понимаю почему мы отнимаем то или иное число...

Автор: korian 18.3.2008, 09:34
mdbr

DragoonFighter, нашел закономерность для перевода из win1251 в OEM (не помню кодировку)
чтоб понять надо посмотреть таблицу символов для одной и другой кодировки.

Автор: Kipter 19.3.2008, 12:11
Код

#include <iostream>
#include <locale>

using namespace std;

void main()
{
    setlocale(LC_ALL, ".OCP");

    wchar_t test[] = L"Рашен Фантастишь?";
    wcout << test << endl;
    wcin >> test;

    wcout << test << endl;
    wcout << L"Бай бай..." << endl;
}


Заместо типа char используй wchar_t
заместо cout и cin - wcout и wcin
перед строковыми константами ставим буковку L
L"Рашен Фантастишь?"
Это макрос.....

И все ты пишешь на юникоде, вообщем то если будешь что нибудь юзать из STL или еще что... часто при работе с текстовыми данными функции работающие на юникоде будут начинаться с прекфикса w
например:
класс - wstring

Автор: archimed7592 20.3.2008, 06:59

M
archimed7592
sasha962, подними взор к небу и увидишь прибитую тему.
Закрыто.


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