читаем в msdn: # LPTSTR - Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. и делаем вывод, что strlen рулит
открываем msdn и читаем: Generic-Text Routine Mappings Код (Text): TCHAR.H Routine _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined _tcslen strlen strlen wcslen видим: if ((_UNICODE & _MBCS Not Defined) | (_MBCS Defined)) _tcslen maps on strlen; но! if (_UNICODE Defined) _tcslen maps on wcslen; а на фига нам это нужно?! LPTSTR ведь остается 8-битным!!!
Не смущай умы неофитов Код (Text): #ifdef UNICODE typedef LPWSTR LPTSTR; #else typedef LPSTR LPTSTR; #endif Windows API -> Windows Data Types
Мы не ищем легких путей, поэтому: Код (Text): for(TCHAR* sp=string;*sp;sp++); int length_in_bytes = ((int)sp - (int)string); int length_in_chars = length_in_bytes / sizeof(TCHAR); :P
Код (Text): for(TCHAR* sp=string;*sp;sp++); int length_in_bytes = ((int)sp - (int)string); int length_in_chars = length_in_bytes / sizeof(TCHAR); можно просто Код (Text): for(TCHAR* sp=string;*sp;sp++); ptrdiff_t length_in_characters = sp - string; разница при вычитании указателей все равно выражается в размере ссылки ну или так Код (Text): for(TCHAR* sp=string;*sp;sp++); size_t length_in_bytes = ((intptr_t)sp - (intptr_t)string); size_t length_in_chars = length_in_bytes / sizeof(TCHAR); а то на x64 такой код посрезает указатели int length_in_bytes = ((int)sp - (int)string);
kaspersky Крис, чего-то ты гонишь LPTSTR будет либо char*, либо whar_t*, в зависимости от того, с какими опциями скомпилен проект - Multibyte или Widechar.
что значит инвалидный ? один из основных способов типа такого только через while Код (Text): size_t xstrlen(const char *str) { const char *ret = str; while (*str) str++; return str - ret; }
Инвалидный значит не транслируется. Переменная цикла используется за пределами видимости, это давно запретили.
я просто это не рассматривал мне все равно пришлось бы переменную за цикл выносить MSVC для C такого все равно не разрешает