|
Вопрос # 3 210/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
здравствуйте, не могли бы вы мне помочь справится с одним багом что ли:
только вот сейчас начал писать проги на С++, в С++ Buildere 2009 года
самый последний он по-моему
так вот создаю консольное приложение
допустим: (смотрите приложение к вопросу)
чтобы написать в консоле приходится писать английскими буквами, а русские отображаются в виде абры-кадабры
это немного напрягает
не подскажите что можно сделать?
Приложение: Переключить в обычный режим- #pragma hdrstop
-
- #include <tchar.h>
- #include <iostream.h>
- #include <iomanip.h>
- #pragma argsused
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- float average;
- int counter, grade, total;
-
- total=0;
- counter=0;
-
- cout << "Vvedite ocenky ili -1 dlya vihoda: ";
- cin >> grade;
-
- while (grade != -1) {
- total += grade;
- counter += 1;
- cout << "Vvedite ocenky ili -1 dlya vihoda: ";
- cin >> grade;
- }
-
- if (counter != 0) {
- average = (float) total/counter;
- cout << "Srednee znachenie ravno "
- << setprecision(2)
- << setiosflags(ios::fixed | ios::showpoint)
- << average << endl;
- }
- cin >> total;
- return 0;
- }
-
 |
Вопрос задал: Ruslan (статус: 1-ый класс)
Вопрос отправлен: 20 сентября 2009, 15:11
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, Ruslan!
1) Есть сайт яндекс - www.yandex.ru - набираем в поле поиска фразу "с++ русские отображаются в виде абры-кадабры". Вылезет куча ссылок на эту тему. Всё дело в кодировках - консоль использует кодировку dos - 866, а все виндовые приложения (в том числе и билдер) - кодировку Windows-1251.
Вариантов решения масса:
а) оставить как есть - русские сообщение не использовать вообще/писать транслитом
б) файлы cpp открывать и писать в досовском редакторе или сохранять в дос-формате - неудобно, при открытии файла в билдере будут абра-кадабра
в) использовать специализированные функции - CharToOem (или CharToOemA) - CharToOem работает с типом char по умолчанию, а CharToOemA - с типом char. обе функции в билдере идентичны. а вот в Visual Studio - нет. Там CharToOem работает с юникодными строками, а CharToOemA - с типом char. Так что лучше использовать CharToOemA - будет работать и там, и там.
2) По "паскалю" и readln - ест в билдере аналог readkey'а - это функция getch(). если работать не будет, значит, в заголовочных файлах надо прописать #include <conio.h>
Пример в приложении
Приложение: Переключить в обычный режим- //---------------------------------------------------------------------------
- #pragma hdrstop
- #include <iostream>
- #include <conio.h>
- #include <windows.h>
- //---------------------------------------------------------------------------
-
- #pragma argsused
- int main(int argc, char* argv[])
- {
-
- CharToOemA(russtr,russtr);
- std::cout << "Hello, world!n" << russtr << std::endl;
- getch();
- return 0;
- }
- //---------------------------------------------------------------------------
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 20 сентября 2009, 17:57
Оценка за ответ: 5
Комментарий к оценке: спасибо!
особенно за getch();!
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 21 сентября 2009, 06:29; участников в обсуждении: 2.
|
Ruslan (статус: 1-ый класс), 20 сентября 2009, 15:14 [#1]:
кстати еще
чтобы как в паскале увидеть что твориться пишем в конце кода readln;
в С++ я пишу cin >> (любую переменную)
можно как-нибудь делать это по-другому?
|
|
Егор (статус: 10-ый класс), 20 сентября 2009, 18:17 [#2]:
можно сделать отдельную функцию, назвать её, например "ToRus" 
работать она будет не с типом char, а со строками - string (они намного удобнее):
код:
#pragma hdrstop
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
//---------------------------------------------------------------------------
#pragma argsused
std::string ToRus(const std::string &in)
{
char *buff = new char [in.length()+1];
CharToOem(in.c_str(),buff);
std::string out(buff);
delete [] buff;
return out;
}
int main(int argc, char* argv[])
{
// пример первый:
std::string s1="Я знаю русский!\n";
std::cout << ToRus(s1);
// пример второй:
std::string s2=ToRus("Вторая строка\n");
std::cout << s2;
// пример третий:
std::cout << ToRus("Третья строка\n");
getch();
return 0;
}
если использовать string, то обязательно нужно подключать заголовочный файл <string>
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 20 сентября 2009, 18:23 [#3]:
вах, ошибка, однако 
символы "& lt;" следует читать как "<" ("меньше"), "& gt;" - как ">" ("больше"), а "& amp" - как "&" ("амперсанд")
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Ruslan (статус: 1-ый класс), 21 сентября 2009, 00:15 [#4]:
работает однако ж!
просто я изучаю С++ 3 дня
скоро и до функций доберусь)
спасибо большое!
а почему вы не пользуетесь cтандартными cin cout
а пользуетесь std::cin and std::cout
??
|
|
Егор (статус: 10-ый класс), 21 сентября 2009, 06:23 [#5]:
Согласно новым стандартам языка с++, потоки cout и cin "напрямую" недоступны. К ним можно получить доступ, подключившись к пространству имён std. Первый способ это сделать - в начале программы написать "using name std;" - но это плохой способ - так мы "вторгаемся" в чужое пространство имён. Второй способ - указывать пространство имён при использовании имён из этого пространства - std::cout, std::cin, std::endl, std::string и т.д.
Последние компиляторы (borland developer studio 2006 и выше, visual studio 2005 и позднее) требуют указания пространства имён, иначе ругаются на cout и cin как на неизвестные имена.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 21 сентября 2009, 06:29 [#6]:
Согласно этим же новым правилам, стандартные заголовочные файлы (iosream, string) указываются в директиве include без расширения h:
#include <iostream>
#include <string>
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|