...There is no indication of success or failure. Failure is rare.
(c) MSDN, CharLower
Здравствуйте, volk, Вы писали:
буфер там просто под строку выделяется, если он не выделился- то и не будет приводиться, а так как в си исключений нет,
то проще эту вероятность ошибки просто проигнорировать)
из исходников reactos:
LPSTR
WINAPI
CharLowerA(LPSTR x)
{
if (!HIWORD(x)) return (LPSTR)tolower((char)(int)x);
CharLowerBuffA(x, strlen(x));
return x;
}
DWORD
WINAPI
CharLowerBuffA(LPSTR str, DWORD len)
{
DWORD lenW;
WCHAR *strW;
if (!str) return 0; /* YES */
lenW = MultiByteToWideChar(CP_ACP, 0, str, len, NULL, 0);
strW = HeapAlloc(GetProcessHeap(), 0, lenW * sizeof(WCHAR));
if (strW) {
MultiByteToWideChar(CP_ACP, 0, str, len, strW, lenW);
CharLowerBuffW(strW, lenW);
len = WideCharToMultiByte(CP_ACP, 0, strW, lenW, str, len, NULL, NULL);
HeapFree(GetProcessHeap(), 0, strW);
return len;
}
return 0;
}
Здравствуйте, Sni4ok, Вы писали:
S>буфер там просто под строку выделяется, если он не выделился- то и не будет приводиться, а так как в си исключений нет, то проще эту вероятность ошибки просто проигнорировать)
За "мухой" потенциальной ошибки с выделением буфера ты не заметил жирного слона.
А слон прячется вот где:
#include <windows.h>
#include <cstdio>
// Не самый редкий вариант -- полтора миллиарда потенциальных пользователей!
#define CP_ACP 936
DWORD
WINAPI
CharLowerBuffA_(LPSTR str, DWORD len)
{
DWORD lenW;
WCHAR *strW;
if (!str) return 0; /* YES */
lenW = MultiByteToWideChar(CP_ACP, 0, str, len, NULL, 0);
strW = (WCHAR *)HeapAlloc(GetProcessHeap(), 0, lenW * sizeof(WCHAR));
if (strW) {
MultiByteToWideChar(CP_ACP, 0, str, len, strW, lenW);
CharLowerBuffW(strW, lenW);
len = WideCharToMultiByte(CP_ACP, 0, strW, lenW, str, len, NULL, NULL);
HeapFree(GetProcessHeap(), 0, strW);
return len;
}
return 0;
}
LPSTR
WINAPI
CharLowerA_(LPSTR x)
{
if (!HIWORD(x)) return (LPSTR)tolower((char)(int)x);
CharLowerBuffA_(x, strlen(x));
return x;
}
int main ()
{
{
char s [] = "MOSKOW (55°45'N, 37°37'E) -- BEIJING (39°54'N, 116°23'E)";
CharLowerA (s);
printf ("%s\n",s); // Мерзко, но терпимо
}
{
char s [] = "MOSKOW (55°45'N, 37°37'E) -- BEIJING (39°54'N, 116°23'E)";
CharLowerA_ (s);
printf ("%s\n",s); // Здравствуйте, кракозябры!
}
getc(stdin);
}