| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Сконвертировать число в строку |
| Автор: ZufuS 18.3.2007, 22:12 | ||
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 | ||
и в чем вопрос собственно?
|
| Автор: belphegor 18.3.2007, 22:40 |
| вместо sprintf напиши itoa(i,buff,10) |
| Автор: ZufuS 18.3.2007, 22:59 |
| Можно поинтересоваться какой параметр за что отвечает? и по какой причине sprintf не работает |
| Автор: Fazil6 18.3.2007, 23:09 |
непоможет. Там тактика неправильная. Под буфер память не выделена Добавлено @ 23:12 вообще ошибка компиллятора не об этом коде если смотреть по номерам строк. Компиллятор просто предупреждает про sprintf, но ошибкой это не считает |
| Автор: Earnest 19.3.2007, 13:59 |
| sprintf нынче считается Unsafe, т.к. вообще никак не проверяет размеров переданного буфера. Но при правильном использовании все прекрасно работает. Есть вариант sprintf (вроде бы snprintf), куда передается размер буфера, за пределы которого она не выйдет. Метод Fazil6 намного медленнее. Добавлено @ 13:59 Но память действительно выделять ты должен сам. |
| Автор: ZufuS 19.3.2007, 23:00 | ||||||
| Было бы хорошо, если б кто-нибудь объяснил в крации что делает буфер и что за память я должен выделять. На этот раз при наличии
при запуске приложения появляется ошибка. Сейчас я не уверен, так же ли я писал в прошлый раз, может я использовал массив. Почему тогда из-за этих двух строчек этой ошибки не возникало. И почему в случае когда *c == "abc"
работает нормально, а
не работает. |
| Автор: Tectoder 20.3.2007, 00:01 | ||
|
| Автор: ZufuS 20.3.2007, 01:32 |
| Tectoder, та же ошибка. |
| Автор: Fazil6 20.3.2007, 02:30 | ||||||||||
у него неправильный код. Не так надо. во первых не
а
а во вторых это еще и после использования надо удалять
во вторых размер ты должен выделять гарантировано больший на 1 чем число знаков числа, которое ты собираешься конвертировать, иначе получишь запись в чужие адреса (то что ты имеешь, когда вообще не выделяешь)
возможно сработает так
|
| Автор: seacat79 20.3.2007, 16:59 |
Я с Unicode работал мало, но по-моему макрос _Т() имеет смысл только для строковых констант. И если необходимо работать с Unicode то вместо char надо использовать wchar_t; |
| Автор: ZufuS 20.3.2007, 17:17 |
| Теперь заработало, спасибо. Хотелось бы спросить по поводу Unicode, от чего зависит необходимость писать _T()? |
| Автор: Fazil6 20.3.2007, 17:20 |
вобщем чего-то подобного следовало ожидать... что ты сделать хочешь? Покажи больше кода Добавлено @ 17:24 это макрос, для представления 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 | ||
Строковые константы в 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 | ||
|
| Автор: 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 | ||
Рисуется буква, напоминающая твёрдый знак. |