Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Сконвертировать число в строку


Автор: ZufuS 18.3.2007, 22:12
Код

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

Автор: Fazil6 18.3.2007, 22:35
и в чем вопрос собственно?

Код


#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;
}


Автор: belphegor 18.3.2007, 22:40
вместо sprintf напиши itoa(i,buff,10)

Автор: ZufuS 18.3.2007, 22:59
Можно поинтересоваться какой параметр за что отвечает? и по какой причине sprintf не работает

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

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

Добавлено @ 23:12 
вообще ошибка компиллятора не об этом коде если смотреть по номерам строк. Компиллятор просто предупреждает про sprintf, но ошибкой это не считает

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

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

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

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);

не работает.

Автор: Tectoder 20.3.2007, 00:01
Код

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

Автор: ZufuS 20.3.2007, 01:32
Tectoder, та же ошибка.

Автор: Fazil6 20.3.2007, 02:30
Цитата(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);


Автор: ZufuS 20.3.2007, 16:52
Цитата(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

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



Я с Unicode работал мало, но по-моему макрос _Т() имеет смысл только для строковых констант. И если необходимо работать с Unicode то вместо char надо использовать wchar_t;

Автор: ZufuS 20.3.2007, 17:17
Теперь заработало, спасибо. Хотелось бы спросить по поводу Unicode, от чего зависит необходимость писать _T()?

Автор: Fazil6 20.3.2007, 17:20
Цитата(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

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

Автор: seacat79 20.3.2007, 17:56
Цитата(ZufuS @  20.3.2007,  17:17 Найти цитируемый пост)
Теперь заработало, спасибо. Хотелось бы спросить по поводу Unicode, от чего зависит необходимость писать _T()? 


Строковые константы в Unicode надо писать в виде  L"строка", а для чего необходимо писать _T() см. пост Tectoder 

Автор: ZufuS 21.3.2007, 11:17
Работает когда просто строку присваиваю, а когда пытаюсь рисовать число, равное итерационной переменной, не компилируется.
В общем пытаюсь разместить в окне 16 кнопок и чтобы на каждой было нарисовано соответствующее число.
for(int i=0; i<16; i++)
{
    //...
    P[i] = CreateWindow(_T("BUTTON"), "%i", WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
        i%4*r.right/4,i/4*r.bottom/4,r.right/4,r.bottom/4,hWnd,(HMENU)0,hInst,NULL);
}

Автор: Fazil6 21.3.2007, 11:46
Код

#include <sstream>


std::wostringstream ws;
for(int i=0; i<16; i++)
{
    //...
    ws.str(_T(""));
    ws << i;
    P[i] = CreateWindow(_T("BUTTON"), ws.str().c_str(), WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
        i*r.right/4,i/4*r.bottom/4,r.right/4,r.bottom/4,hWnd,(HMENU)0,hInst,NULL);
}

Автор: ZufuS 21.3.2007, 12:05
А это лучший способ? Вроде есть функция swprintf(), но у меня не получается ею воспользоваться.
1>.\123.cpp(117) : warning C4995: 'swprintf': name was marked as #pragma deprecated
1>.\123.cpp(117) : error C2665: 'swprintf' : none of the 2 overloads could convert all the argument types
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\swprintf.inl(36): could be 'int swprintf(wchar_t *,size_t,const wchar_t *,...)'
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\swprintf.inl(85): or 'int swprintf(wchar_t *,const wchar_t *,...)'
1>        while trying to match the argument list '(wchar_t *, int, const char [3], int)'

Автор: Tectoder 21.3.2007, 12:24
Вместо 'swprintf'  надо юзать StringCchPrintf, я говорил уже об этом в топике. Ты его читаешь?

Автор: ZufuS 12.4.2007, 00:44
Код

wchar_t *c=new wchar_t(100);
StringCchPrintf(c,100,(STRSAFE_LPCWSTR)"%i",1);
CreateWindow(_T("BUTTON"), c, WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE, 0, 0, 100, 50, hWnd, (HMENU)0, hInst, NULL);

Рисуется буква, напоминающая твёрдый знак.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)