Длинна строки LPTSTR

Тема в разделе "LANGS.C", создана пользователем Keva, 15 май 2007.

  1. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Как определить длинну строки типа LPTSTR?
     
  2. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    читаем в msdn:
    # LPTSTR - Pointer to a null-terminated string of 8-bit Windows (ANSI) characters.
    и делаем вывод, что strlen рулит ;)
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Лучше _tcslen().
     
  4. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Благодарю
     
  5. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    открываем msdn и читаем:
    Generic-Text Routine Mappings

    Код (Text):
    1. TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined
    2. _tcslen              strlen                                    strlen              wcslen
    видим:
    if ((_UNICODE & _MBCS Not Defined) | (_MBCS Defined)) _tcslen maps on strlen;
    но!
    if (_UNICODE Defined) _tcslen maps on wcslen;
    а на фига нам это нужно?! LPTSTR ведь остается 8-битным!!!
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Не смущай умы неофитов ;)
    Код (Text):
    1. #ifdef UNICODE
    2.  typedef LPWSTR LPTSTR;
    3. #else
    4.  typedef LPSTR LPTSTR;
    5. #endif
    Windows API -> Windows Data Types
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Мы не ищем легких путей, поэтому:
    Код (Text):
    1. for(TCHAR* sp=string;*sp;sp++);
    2. int length_in_bytes = ((int)sp - (int)string);
    3. int length_in_chars = length_in_bytes / sizeof(TCHAR);
    :P
     
  8. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Код (Text):
    1. for(TCHAR* sp=string;*sp;sp++);
    2. int length_in_bytes = ((int)sp - (int)string);
    3. int length_in_chars = length_in_bytes / sizeof(TCHAR);
    можно просто

    Код (Text):
    1. for(TCHAR* sp=string;*sp;sp++);
    2. ptrdiff_t length_in_characters = sp - string;
    разница при вычитании указателей все равно выражается в размере ссылки

    ну или так

    Код (Text):
    1. for(TCHAR* sp=string;*sp;sp++);
    2. size_t length_in_bytes = ((intptr_t)sp - (intptr_t)string);
    3. size_t length_in_chars = length_in_bytes / sizeof(TCHAR);
    а то на x64 такой код посрезает указатели
    int length_in_bytes = ((int)sp - (int)string);
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    kaspersky

    Крис, чего-то ты гонишь :) LPTSTR будет либо char*, либо whar_t*, в зависимости от того, с какими опциями скомпилен проект - Multibyte или Widechar.
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Не некропость, многие гонят, все for выше есть инвалидный С.
     
  11. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    что значит инвалидный ? один из основных способов

    типа такого только через while

    Код (Text):
    1. size_t xstrlen(const char *str)
    2. {
    3.     const char *ret = str;
    4.     while (*str)
    5.         str++;
    6.     return str - ret;
    7. }
     
  12. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    через while уже не инвалидный ? может просто Вам for не нравится :)
     
  13. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Инвалидный значит не транслируется. Переменная цикла используется за пределами видимости, это давно запретили.
     
  14. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    я просто это не рассматривал мне все равно пришлось бы переменную за цикл выносить MSVC для C такого все равно не разрешает