кириллица в консольной программе

  • Автор темы Seva
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Seva

Сделал программу, такую, как хотел, но возникла проблема... изучаю программирование недавно, потому не думал, что такая проблема возникнет. короче, программа: у пользователя в буфере обмена несколько слов, например, (дворец король королева), при открытии программы, слова обрабатываются специальным образом и у пользователя в буфере обмена оказывается что-то типа (король дворец королева). если изначально слова написаны латиницей, то всё отлично, а вот если кириллицей- то в результате получаются одни ???? в буфере обмена... догадываюсь, что это обычное дело, но неужели нельзя никак решить эту проблему, кроме как изменения кодировки на компьютере? хотелось бы, чтобы эта программа работала на любом другом компьютере, кроме моего, тоже. наверное, можно решить эту проблему, написав приложение win32, но я пока не умею, т. ч. хотелось бы доработать этот вариант! может, можно что-то забить в программу? спасибо всем за ответы!
 
S

Seva

спасибо, поиском научился пользоваться раньше, чем программировать! читал я эти посты, но мне не подходит- как быть, если слова изначально будут на разных языках, т. е. некоторые кириллицей, а некоторые- латиницей? разве вот только CharToOem попробовать, но, как начинающий, я не умею, на мастдае сложно разобраться, ибо в английском не силён! не могли бы Вы описать правила использования этой функции? спасибо!
 
E

European

<!--QuoteBegin-Seva+7:05:2007, 17:17 -->
<span class="vbquote">(Seva @ 7:05:2007, 17:17 )</span><!--QuoteEBegin-->если слова изначально будут на разных языках, т. е. некоторые кириллицей, а некоторые- латиницей?
[snapback]65095" rel="nofollow" target="_blank[/snapback]​
[/quote]
В таких случаях мой препод по программированию говорил: "Вот вам компутер, бери и пробуй...". Вот и у меня к тебе такой же вопрос: а ты пытался выводит такие предложения после конвертирования с помощью CharToOem? Каков результат?
 
S

Seva

:) :) пробовал... вот уже несколько дней бьюсь, НО! в программе кирилическое слово поступает из буфера обмена, т. е. тип строковый, string, а CharToOem обрабатывает только тип char, как я понимаю, ибо ни в какую не хочет работать со строковым параметром. ещё предложения?
 
E

European

<!--QuoteBegin-Seva+15:05:2007, 11:22 -->
<span class="vbquote">(Seva @ 15:05:2007, 11:22 )</span><!--QuoteEBegin-->т. е. тип строковый, string,
[snapback]65990" rel="nofollow" target="_blank[/snapback]​
[/quote]
Я так понимаю, что std::string? Тогда string.c_str() вернет char*
 
S

Seva

это вот так:
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
string name="проблема";
char bulb=name.c_str();
cout<<"1: "<<name
<<"\n2: "<<bulb<<endl;
return 0;
}
?
не работает! пишет 1 ошибка:
(7) error C2440: 'initializing' : cannot convert from 'const char *' to 'char'
так как же можно преобразовать string в char? например, с помощью atof() можно сделать такое преобразование, не пробовали? а если можно, то как?
 
E

European

Если очень хочется, то можно сделать следующим образом, однако такая строка - потенциальный источник ошибок на этапе выполнения:
Код:
const char* bulb = name.c_str();
Лучше сделать вот так:
Код:
	cout<<"1: "<< name
<<"\n2: "<< name.c_str() <<endl;
 
S

Seva

спасибо, конечно, первый вариант лучше подходит, НО, опять проблема, опять преобразование... теперь бы этот char* bulb преобразовать в char c_bulb, чтобы его потом функцией CarToOem обработать, а с char* она не хочет работать! ;) не знаете как это решить?
 
E

European

Уважаемый, а вы в MSDN хоть заглядывали?
Преобразуй char* в LPCTSTR или LPSTR в зависимости от параметра
 
S

Seva

Да заглядывал, заглядывал, даже больше- старался внимательно изучать... но вот что у меня получается:
#include<iostream>
#include <windows.h>
#include<string>
using namespace std;
int main(void)
{
char bulb2;
string name="проблема";
const char* bulb = name.c_str();
CharToOem(bulb2,bulb);


cout<<"1: "<<name
<<"\n2: "<<bulb2<<endl;
return 0;
}
по задумке на экране в строчке 2 должно быть слово "проблема" (bulb2), но компилятор упорно выдаёт ошибку:

(10) : error C2664: 'CharToOemA' : cannot convert parameter 1 from 'char' to 'const char *'

это опять я что-то не так сделал? а что? вроде, всё, как в мастдае написано...
 
G

GRLEX

Попробуй поставить амперсанд.
<!--QuoteBegin-Seva+15:05:2007, 17:57 -->
<span class="vbquote">(Seva @ 15:05:2007, 17:57 )</span><!--QuoteEBegin-->CharToOem(bulb2,bulb);
[snapback]66053" rel="nofollow" target="_blank[/snapback]​
[/quote]
в этой фразе перед blub2
;)
 
E

European

О-о, какой-то мастдай у тебя неправильный, если ты параметры местами перепутал... А я то думаю, чего CharToOem с char* не хочет работать...
Код:
int main(void)
{
char bulb2[20];
string name = "проблема";
CharToOem( name.c_str(), bulb2 );

cout << "1: " << name << endl;
cout << "2: " << bulb2 << endl;
return 0;
}

<!--QuoteBegin-GRLEX+15:05:2007, 18:18 -->
<span class="vbquote">(GRLEX @ 15:05:2007, 18:18 )</span><!--QuoteEBegin-->Попробуй поставить амперсанд.
[snapback]66060" rel="nofollow" target="_blank[/snapback]​
[/quote]
И по колесам постучи
 
S

Seva

О! то, что доктор прописал! СПАСИБО!
 
E

European

Жаль, что спасибо на хлеб не намажешь :)
 
S

Seva

ага, и в стакан налить тоже! :)
работаем дальше... возникает опять проблема: из буфера обмена всё выводится на экран, но не всегда корректно, т. е. если в буфере ТОЛЬКО кирилические символы (Иван) или ТОЛЬКО латиница (Pupkin), то всё работает корректно, но стоит поработать с совмещённым буфером (Иван Pupkin), так сразу вместо кирилицы получаются ??? не подскажете в чём проблема? вот код:
Код:
//из буфера обмена на экран
#include<iostream>
#include<string>
#include <windows.h>
#pragma comment(lib, "user32.lib")
using namespace std;
int main(void)
{
char bulb[20];	
string fromClipboard, name;
OpenClipboard(0);
{
HANDLE hData=GetClipboardData(CF_TEXT);
char* chBuffer=((char*)GlobalLock(hData));
fromClipboard=chBuffer;
CharToOem(fromClipboard.c_str(),bulb);
GlobalUnlock(hData);
CloseClipboard();

}
cout<<bulb<<endl;
cin>>name;
return 0;
}
 
S

Sailor

че вы тупите вот код
#include <windows.h>
char BufRus[255];
char *Rus(char *str)
{
CharToOem(Str,BufRus);
return BufRus;

}
int main()
{
cout<<Rus("Ни каких проблем с русским текстом");
getch();
return 0;
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!