Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: В консоли на русском...проверте пожалуйста...  (Прочитано 16116 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Podarochek
Гость
« : 24-07-2007 13:56 » 

Создал вот такую функцию для преобразования текста в консоли на русский...
Пожалуйста выскажите свое мнение и если можно укажите недостатки и пути доработки...


#include <iostream> // для cout
#include <windows.h> // для CharToOem
#include <string.h>//для strlen
using namespace std;

void rus_str( char* _str )
{   
   int size;
   size=strlen(_str);
   char *str=new char[size];
   CharToOem( _str, str );
   cout<<str;
      
}
void main ()
{

rus_str( "Текущий текст на русском языке.");

}
 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 24-07-2007 17:15 » 

как бы кроме ошибки работы с кучей и не знаю, что подсказать )

а ошибка - забыл освободить память:
Код:
   //выделил
   char *str=new char[size];

   //...

   //теперь, когда перестали работать с буфером,
   //надо вернуть память в кучу
   delete [] str;
Записан

Podarochek
Гость
« Ответ #2 : 24-07-2007 20:03 » 

так выдает ошибку

heap corruption detected
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 24-07-2007 20:09 » 

Podarochek а можно полный списочек зачитать (с)

Приведи свой код пожалуйста полностью.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Podarochek
Гость
« Ответ #4 : 24-07-2007 20:38 » new

#include <iostream> // для cout
#include <windows.h> // для CharToOem
#include <string.h>//для strlen
using namespace std;

void rus_str( char* _str )
{   
   int size;
   size=strlen(_str);
   char *str=new char[size];
   CharToOem( _str, str );
   cout<<str;
   delete [] str;

      
}
void main ()
{

rus_str( "Текущий текст на русском языке.");

}
Записан
Podarochek
Гость
« Ответ #5 : 24-07-2007 20:41 » 

да, и может подскажете мысли про оператор вида: p = a[ N>>1 ];
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 24-07-2007 21:08 » 

N>>1 равносильно N/2. Оператор  >> это логический сдвиг вправо.
Следовательно p=a[N>>1] эквивалентно p=a[N/2]
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 24-07-2007 21:10 » 

Вот так попробуй
Код:
#include <iostream> // для cout
#include <windows.h> // для CharToOem
#include <string.h>//для strlen
using namespace std;

void rus_str( char* _str )
{   
   int size;
   size=strlen(_str)+1;
   char *str=new char[size];
   CharToOem( _str, str );
   cout<<str;
   delete [] str;

     
}
void main ()
{

rus_str( "Текущий текст на русском языке.");

}

strlen(_str) выдает длину строки без учета терминального байта. В функции CharToOem идет копирование также и терминального байта.
« Последнее редактирование: 24-07-2007 21:12 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Podarochek
Гость
« Ответ #8 : 24-07-2007 21:22 » 

 ...+1 это для нуль-символа...Почему же только после результата выдавал ошибку, а не сразу...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 24-07-2007 21:38 » 

Ты скорее всего делаеш Debug версию. В Dеbug версии выделяется под каждый массив буффер безопасности и заполняется числом 0xCF. В момент удаления проверяется целостность данного буффера. Это верно для VC++6.0.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Podarochek
Гость
« Ответ #10 : 24-07-2007 22:06 » 

у меня VC++8.0
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 28-07-2007 16:36 » 

Вено для всех VC++ старше 6.0, это точно сам проверил Улыбаюсь

что касается приведённого решения

то ИМХО, это не мой метод, я бы настроил параметры локали и не заморачивался с переводом, если это конечно не вывод, после чтения из файла или иные манипуляции с внешними по отноошению к программе данными.

Записан

Странно всё это....
Vlaor
Гость
« Ответ #12 : 29-07-2007 09:04 » 

По умолчанию используется кодовая страница 866 необходимо вставить
SetConsoleOutputCP(1251);
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines