Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сконвертировать число в строку 
:(
    Опции темы
ZufuS
Дата 18.3.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Код

char *c;
sprintf(c, "%i", 1);
CreateWindow(_T("BUTTON"), _T(c), WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE, 0, 0, 100, 50, hWnd, (HMENU)0, hInst, NULL);

1>.\123.cpp(105) : warning C4996: 'sprintf' was declared deprecated
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(345) : see declaration of 'sprintf'
1>        Message: 'This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>.\123.cpp(108) : error C2065: 'Lc' : undeclared identifier
PM   Вверх
Fazil6
Дата 18.3.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



и в чем вопрос собственно?

Код


#include <sstream>
#include <Windows.h>

template 
<typename T>
std::string ConvertToStr(T value)
{
    std::ostringstream s;
    s << value;
    return s.str();
}
int main()
{

  ::MessageBox(0, ConvertToStr(10).c_str(), ConvertToStr(10.10).c_str(), 0);
    
   return 0;
}


PM MAIL   Вверх
belphegor
Дата 18.3.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.12.2006
Где: Молдова, Кишинев

Репутация: нет
Всего: нет



вместо sprintf напиши itoa(i,buff,10)
PM MAIL   Вверх
ZufuS
Дата 18.3.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Можно поинтересоваться какой параметр за что отвечает? и по какой причине sprintf не работает

Это сообщение отредактировал(а) ZufuS - 18.3.2007, 23:00
PM   Вверх
Fazil6
Дата 18.3.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



Цитата(belphegor @  18.3.2007,  21:40 Найти цитируемый пост)
вместо sprintf напиши itoa(i,buff,10)

непоможет. Там тактика неправильная. Под буфер память не выделена

Добавлено @ 23:12 
вообще ошибка компиллятора не об этом коде если смотреть по номерам строк. Компиллятор просто предупреждает про sprintf, но ошибкой это не считает
PM MAIL   Вверх
Earnest
Дата 19.3.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



sprintf нынче считается Unsafe, т.к. вообще никак не проверяет размеров переданного буфера. Но при правильном использовании все прекрасно работает. 
Есть вариант sprintf (вроде бы snprintf), куда передается размер буфера, за пределы которого она не выйдет.
Метод Fazil6 намного медленнее.

Добавлено @ 13:59 
Но память действительно выделять ты должен сам.


--------------------
...
PM   Вверх
ZufuS
Дата 19.3.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Было бы хорошо, если б кто-нибудь объяснил в крации что делает буфер и что за память я должен выделять.
На этот раз при наличии
Код

char *c;
sprintf(c, "%i", 1);

при запуске приложения появляется ошибка. Сейчас я не уверен, так же ли я писал в прошлый раз, может я использовал массив. Почему тогда из-за этих двух строчек этой ошибки не возникало.
И почему в случае когда *c == "abc" 
Код

CreateWindow(_T("BUTTON"), _T("abc"), WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,10,10,20,20,hWnd,(HMENU)0,hInst,NULL);

работает нормально, а
Код

CreateWindow(_T("BUTTON"), _T(c), WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,10,10,20,20,hWnd,(HMENU)0,hInst,NULL);

не работает.
PM   Вверх
Tectoder
Дата 20.3.2007, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



Код

char *c=new char(100);
StringCchPrintf(c,100,"%i",1)


Это сообщение отредактировал(а) Tectoder - 20.3.2007, 00:02
PM   Вверх
ZufuS
Дата 20.3.2007, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Tectoder, та же ошибка.
PM   Вверх
Fazil6
Дата 20.3.2007, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



Цитата(ZufuS @  20.3.2007,  00:32 Найти цитируемый пост)
 та же ошибка.

у него неправильный код. Не так надо.
во первых не
Код

char *c=new char(100);

а
Код

char *c=new char[100]; // выделение буфера для строки из 99 символов + '\0'

а во вторых это еще и после использования надо удалять
Код

delete [] c;

во вторых размер ты должен выделять гарантировано больший на 1 чем число знаков числа, которое ты собираешься конвертировать, иначе получишь запись в чужие адреса (то что ты имеешь, когда вообще не выделяешь)
Код

char *c = "abc";
CreateWindow(_T("BUTTON"), _T(c), WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,10,10,20,20,hWnd,(HMENU)0,hInst,NULL);

возможно сработает так
Код

char *c = "abc";
CreateWindow(_T("BUTTON"), _T(*c), WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,10,10,20,20,hWnd,(HMENU)0,hInst,NULL);


PM MAIL   Вверх
ZufuS
Дата 20.3.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  20.3.2007,  02:30 Найти цитируемый пост)
возможно сработает так 
Код

char *c = "abc";
CreateWindow(_T("BUTTON"), _T(*c), WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,10,10,20,20,hWnd,(HMENU)0,hInst,NULL);

error C2065: 'L' : undeclared identifier

Это сообщение отредактировал(а) ZufuS - 20.3.2007, 16:53
PM   Вверх
seacat79
Дата 20.3.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 27.2.2007
Где: Украина, Одесса

Репутация: нет
Всего: 1



Цитата(ZufuS @  20.3.2007,  16:52 Найти цитируемый пост)
_T(*c)



Я с Unicode работал мало, но по-моему макрос _Т() имеет смысл только для строковых констант. И если необходимо работать с Unicode то вместо char надо использовать wchar_t;
PM MAIL ICQ   Вверх
ZufuS
Дата 20.3.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Теперь заработало, спасибо. Хотелось бы спросить по поводу Unicode, от чего зависит необходимость писать _T()?
PM   Вверх
Fazil6
Дата 20.3.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



Цитата(ZufuS @  20.3.2007,  15:52 Найти цитируемый пост)
error C2065: 'L' : undeclared identifier

вобщем чего-то подобного следовало ожидать...

что ты сделать хочешь?
Покажи больше кода

Добавлено @ 17:24 
Цитата(ZufuS @  20.3.2007,  16:17 Найти цитируемый пост)
от чего зависит необходимость писать _T()

это макрос, для представления ASCII в Юникоде

"превед" - ASCII

_T("превед") тоже __T("превед")  тоже _TEXT("превед") тоже L"превед" - Unicode
PM MAIL   Вверх
Tectoder
Дата 20.3.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



_T!=L
значение макроса _T(и _TEXT) зависит от директивы UNICODE. Если она установлена, _T равно L, если не установлена, то _T ничего не делает.
Это нужно для придания программе универсальности. Если в программе везде исользуется макрос _T, а не оператор L, то для того что бы сменить всю кодировку программы, достаточно изменить в ней одну строчку, определяющую символ UNICODE

Это сообщение отредактировал(а) Tectoder - 20.3.2007, 17:39
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1093 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.