Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 105, средняя оценка - 4.67
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 1
#1

трудности с CharToOem - C++

18.08.2009, 16:38. Просмотров 12775. Ответов 15
Метки нет (Все метки)

есть код:
C++
1
2
3
4
5
6
7
8
char* Rus(char* text)
{
    char* buf = new char(600);
    CharToOem(text, buf);
    strcpy(text, buf);
    delete buf;
    return text;
};
в билдере работает отлично, в code block (gnu gcc) - выпадает и все, что я написал неправильно? голову уже сломал всю
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2009, 16:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос трудности с CharToOem (C++):

замена chartooem - C++
подскажите вот есть такой код: char bufer ; char*rus (char*s) { CharToOem (s,bufer); return bufer; но на борланде 3.1 нету и...

Функция CharToOem - C++
Объясните пожалуйста, в чем тут ошибка? #include <windows.h> #include <stdio.h> #include <conio.h> int main() { char...

VS C++ Не работает CharToOem - C++
#include <iostream> #include<Windows.h> using namespace std; void reversit(char); int main() { setlocale(LC_ALL, "rus"); ...

Ошибка с CharToOem - C++
Часть с кода: #include <iostream> #include <windows.h> #include <conio.h> using namespace std; void rus (char*src) ...

Помогите с CharToOem и ещё с if and else - C++
Всем доброго дня. У меня вот такая вот проблема не могу разобраться по чему не работает русский язык, пишет что CharToOem невозможно...

Function 'CharToOem' should have a prototype - C++
#include <iostream.h> #include <conio.h> #include <windows.h> #include<iomanip.h> char NEWT; char*RUS(char*TEXT) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.08.2009, 16:43 #2
на первый взгляд delete buf => delete [] buf

Добавлено через 1 минуту 23 секунды
и вот это, если не ошибаюсь -
char* buf = new char(600);
это выделение памяти для ОДНОГО символа и инициализация его значением (char) 600
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 1
18.08.2009, 16:46  [ТС] #3
Rififi, в даун уходит на копировании с помощью strcpy

вот этот код работает нормально:
C++
1
2
3
4
5
string Rus(string text)
{
    CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str());
    return text;
};
а этот все никак:
C++
1
2
3
4
5
6
7
8
char* Rus(char* text)
{
    char* buf = new char[strlen(text) + 1];
    CharToOem(text, buf);
    strcpy(text, buf);
    delete [] buf;
    return text;
};
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.08.2009, 16:55 #4
вот этот код работает нормально:

(LPSTR)text.c_str()
первое правило опытного програмиста на C++ (:

в c_str() заливать данные нельзя. period.

а этот все никак:
очевидно, где-то портится память до вызова Rus.
потому как сам код корректный.
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 1
18.08.2009, 17:00  [ТС] #5
Rififi, на счет правил спорить не буду, но опытным путем пришел к тому, что он все же работает... и не понятно, почему нельзя заливать в char*, ведь это же возвращает c_str(), если я не путаю... а еще дебаггер почему-то показывает проблему в функции strcat
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.08.2009, 17:07 #6
VoodooMan,
потому что то, что возвращает c_str() не обязательно является внутренним представлением объекта string. Стандарт говорит только что ты получшь указатель на область памяти с char-данными, заканчивающимися нулём. не просто так возвращаемое значение имеет тип const char*

на счет правил спорить не буду
"правила" в том смысле что ты придерживаешься какого-то стиля кодинга, не потому что типа так захотел, а потому что стандарт обязывает.
не you mustn't, а you haven't

а еще дебаггер почему-то показывает проблему в функции strcat
А вот это уже из FAQ

Вопрос:

Моя программа не работает. Я думаю, проблема в системном компоненте X.
Ответ:

Хотя и возможно, что именно вы первым обнаружили очевидную ошибку в системных вызовах и библиотеках, интенсивно используемых сотнями или даже тысячами разработчиков, но намного вероятнее, что вы просто не разобрались. Серьёзные утверждения требуют серьёзных доказательств. Если вы делаете подобные утверждения, их надо подкреплять ясным и исчерпывающим описанием ситуации, в которой возникает сбой.

Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 1
18.08.2009, 17:17  [ТС] #7
я не утверждал, что баг где-то в стандартных библиотеках, просто не могу понять, отчего же код выпадает на функции strcpy... а на счет c_str - возьму на заметку, мерси за справку
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.08.2009, 17:22 #8
везде где только можно в подозрительных местах расставь
assert(IsBadStringPtr(...) == FALSE);
и вообще, ассерты вместе с IsBad* - рулят
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 1
18.08.2009, 18:21  [ТС] #9
вот так тоже работает:
C++
1
2
3
4
5
6
7
8
string Rus(string text)
{
    char* buf = new char[text.length()];
    CharToOem((LPCTSTR)text.c_str(), buf);
    strcpy((char*)text.c_str(), buf);
    delete buf;
    return text;
};
может кто-то на студии код из первого поста проверить что ли?


Rififi,а если нельзя использовать c_str(), тогда какой лучше метод использовать из класса basic_string, чтобы он не возвращал const?
Phantom
Эксперт C++
3164 / 846 / 16
Регистрация: 29.12.2008
Сообщений: 952
18.08.2009, 18:25 #10
Из третьего поста код проверил (который из первого переделан), не работает. VC 2008. Ума не приложу почему, всю голову сломал.
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 1
18.08.2009, 18:30  [ТС] #11
Phantom,а в билдере из первого поста работает, и если юзать string (хоть Rififi и глумиться надо мной) тоже работает везде... есть подозрения, что это из-за функции chartooem... хотя не факт...
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.08.2009, 18:44 #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
что-то у вас там не того...
вот пример, работает на vs2008 (заменил вызов на явный для ansi-версии)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
 
char* Rus(char* text)
{
    char* buf = new char[strlen(text) + 1];
    CharToOemA(text, buf);
    strcpy(text, buf);
    delete [] buf;
    return text;
};
 
int main()
{
    char s[] = "Hello, world!, ЇаЁўҐв, ¬Ёа";
    std::cout << s << std::endl;
    Rus(s);
    std::cout << s << std::endl;
 
    return 0;
}
вывод:
Hello, world!, привет, мир
Hello, world!, ЇаЁў_в, ┐Ёа
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 1
18.08.2009, 19:14  [ТС] #13
я понял, где я был дурак... я передавал константу и пытался ее править... а вот стринги работали, потому что они хоть и возвращают const char*, а к редактированию ее относятся спокойней... почему-то...
Phantom
Эксперт C++
3164 / 846 / 16
Регистрация: 29.12.2008
Сообщений: 952
18.08.2009, 19:16 #14
Цитата Сообщение от VoodooMan Посмотреть сообщение
я понял, где я был дурак... я передавал константу и пытался ее править...
Я тоже стормозил в том же самом
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
18.08.2009, 19:25 #15
VoodooMan,
я передавал константу и пытался ее править...
да ты прямо рассадник хауту "как не надо делать"

что касается стринга, то модификация через c_str() работает потому, что stl в VS хранит внутри себя строку в ASCIIZ-виде (чего сам объект std::string не делает)

для достижения гармонии между char и std::string я обычно пользуюсь таким велосипедом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
template <
    const size_t N,
    typename _E, typename _Tr, typename _Ax,
    template <typename, typename, typename> class _S>
struct str_buf_type
{
    typedef _E char_type;
    typedef _S<char_type, _Tr, _Ax> string_type;
 
    explicit str_buf_type(string_type& str) : pstr_(&str) { buf_[0] = 0; }
    ~str_buf_type() { pstr_->assign(buf_); }
    operator char_type*() { return buf_; }
 
    static const size_t BUF_SIZE = N;
 
    char_type buf_[BUF_SIZE];
    string_type* pstr_;
};
 
template <
    const size_t N,
    typename _E, typename _Tr, typename _Ax,
    template <typename, typename, typename> class _S>
str_buf_type<N, _E, _Tr, _Ax, _S> str_buf(_S<_E, _Tr, _Ax>& s)
{
    return str_buf_type<N, _E, _Tr, _Ax, _S>(s);
}
 
// Использование с некоей функцией, которая наполняет char-буфер
std::string s;
GetCurrentDirectoryA(MAX_PATH, str_buf<MAX_PATH>(s));
 
std::wstring ws;
GetCurrentDirectoryW(MAX_PATH, str_buf<MAX_PATH>(ws));
Кривовато, но зато работоспособность этого кода гарантируется Стандартом на всех реализациях, поддерживающих онный.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2009, 19:25
Привет! Вот еще темы с ответами:

CharToOem заглавные русские буквы - C++
не могу понять почему не пишутся русские заглавные буквы. передаю параметр в программу /label &quot;Иванов И.В&quot; После преобразования...

Не работает CharToOem в Microsoft Visual C++ 2010 express - C++
Здравствуйте! Не работает CharToOem в Microsoft Visual C++ 2010 express. А также все другие варианты работы с русской строкой в...

Функция с CharToOem не возвращает слово через return - C++
Здравствуйте! У меня есть такая: ф-ия char* rus3(char* c) { char buf; CharToOem(c,buf); return buf; }

Трудности с include - C++
Всем привет! Есть два класса, 1 описан в header1.h, второй в header2.h. Во втором классе нужно использовать экземпляр первого и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.08.2009, 19:25
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru