Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 210

Раздел: C++
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
здравствуйте, не могли бы вы мне помочь справится с одним багом что ли:
только вот сейчас начал писать проги на С++, в С++ Buildere 2009 года
самый последний он по-моему
так вот создаю консольное приложение
допустим: (смотрите приложение к вопросу)

чтобы написать в консоле приходится писать английскими буквами, а русские отображаются в виде абры-кадабры

это немного напрягает
не подскажите что можно сделать?

Приложение:
  1. #pragma hdrstop
  2.  
  3. #include <tchar.h>
  4. #include <iostream.h>
  5. #include <iomanip.h>
  6. #pragma argsused
  7.  
  8. int _tmain(int argc, _TCHAR* argv[])
  9. {
  10. float average;
  11. int counter, grade, total;
  12.  
  13. total=0;
  14. counter=0;
  15.  
  16. cout << "Vvedite ocenky ili -1 dlya vihoda: ";
  17. cin >> grade;
  18.  
  19. while (grade != -1) {
  20. total += grade;
  21. counter += 1;
  22. cout << "Vvedite ocenky ili -1 dlya vihoda: ";
  23. cin >> grade;
  24. }
  25.  
  26. if (counter != 0) {
  27. average = (float) total/counter;
  28. cout << "Srednee znachenie ravno "
  29. << setprecision(2)
  30. << setiosflags(ios::fixed | ios::showpoint)
  31. << average << endl;
  32. }
  33. cin >> total;
  34. return 0;
  35. }
  36.  


Ruslan Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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>

Пример в приложении

Приложение:
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include <iostream>
  4. #include <conio.h>
  5. #include <windows.h>
  6. //---------------------------------------------------------------------------
  7.  
  8. #pragma argsused
  9. int main(int argc, char* argv[])
  10. {
  11.  
  12. CharToOemA(russtr,russtr);
  13. std::cout << "Hello, world!n" << russtr << std::endl;
  14. getch();
  15. return 0;
  16. }
  17. //---------------------------------------------------------------------------


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 20 сентября 2009, 17:57
Оценка за ответ: 5

Комментарий к оценке: спасибо!
особенно за getch();!

Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 21 сентября 2009, 06:29; участников в обсуждении: 2.
Ruslan

Ruslan (статус: 1-ый класс), 20 сентября 2009, 15:14 [#1]:

кстати еще
чтобы как в паскале увидеть что твориться пишем в конце кода readln;
в С++ я пишу cin >> (любую переменную)
можно как-нибудь делать это по-другому?
Егор

Егор (статус: 10-ый класс), 20 сентября 2009, 18:17 [#2]:

можно сделать отдельную функцию, назвать её, например "ToRus" :)
работать она будет не с типом char, а со строками - string (они намного удобнее):
код:
#pragma hdrstop
#include &lt;iostream&gt;
#include &lt;conio.h&gt;
#include &lt;windows.h&gt;
#include &lt;string&gt;
//---------------------------------------------------------------------------
#pragma argsused
std::string ToRus(const std::string &amp;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 &lt;&lt; ToRus(s1);
 
  // пример второй:
  std::string s2=ToRus("Вторая строка\n");
  std::cout &lt;&lt; s2;
 
  // пример третий:
  std::cout &lt;&lt; ToRus("Третья строка\n");
  getch();
  return 0;
}

если использовать string, то обязательно нужно подключать заголовочный файл <string>
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 20 сентября 2009, 18:23 [#3]:

вах, ошибка, однако :)
символы "& lt;" следует читать как "<" ("меньше"), "& gt;" - как ">" ("больше"), а "& amp" - как "&" ("амперсанд")
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Ruslan

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 &lt;iostream&gt;
#include &lt;string&gt;
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.03 сек.