Поделиться через


strlen, , wcslen_mbslen_l_mbslen_mbstrlen,_mbstrlen_l

Получает длину строки, используя текущий или указанный языковой стандарт. Доступны более безопасные версии этих функций; see, strnlen_s_mbstrnlenwcsnlenwcsnlen_s_mbsnlen_mbsnlen_lstrnlen_mbstrnlen_l

Внимание

_mbslen, _mbslen_l, _mbstrlen и _mbstrlen_l нельзя использовать в приложениях, выполняемых в среде выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.

Синтаксис

size_t strlen(
   const char *str
);
size_t wcslen(
   const wchar_t *str
);
size_t _mbslen(
   const unsigned char *str
);
size_t _mbslen_l(
   const unsigned char *str,
   _locale_t locale
);
size_t _mbstrlen(
   const char *str
);
size_t _mbstrlen_l(
   const char *str,
   _locale_t locale
);

Параметры

str
Строка, завершающаяся символом NULL.

locale
Используемый языковой стандарт.

Возвращаемое значение

Каждая из этих функций возвращает количество символов, strза исключением значения NULL терминала. Зарезервированное возвращаемое значение для обозначения ошибки отсутствует, за исключением _mbstrlen и _mbstrlen_l, которые возвращают ((size_t)(-1)), если строка содержит недопустимый многобайтовый символ.

Замечания

strlen интерпретирует строку как строку однобайтовых символов, поэтому возвращаемое значение всегда равно числу байт, даже если строка содержит многобайтовые символы. wcslen — это версия strlen с расширенными символами; аргумент wcslen — строка расширенных символов, а число символов выражается в расширенных (двухбайтовых) символах. Поведениеwcslen и strlen идентично в противном случае.

Примечание о безопасности. Эти функции предполагают потенциальную угрозу, связанную с проблемой переполнения буфера. Проблемы переполнения буфера — это распространенный метод атак на системы, который приводит к несанкционированному повышению уровня прав. Дополнительные сведения см. в разделе "Избегание переполнения буфера".

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H рутина _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_tcslen strlen strlen wcslen
_tcsclen strlen _mbslen wcslen
_tcsclen_l strlen _mbslen_l wcslen

_mbslen и _mbslen_l возвращает количество многобайтовых символов в строке многобайтового символа, но они не проверяются на допустимость многобайтовых символов. _mbstrlen и _mbstrlen_l проверяют допустимость многобайтовых символов и распознают их последовательности. Если строка, переданная в _mbstrlen или _mbstrlen_l, содержит недопустимый многобайтовый символ для кодовой страницы, функция возвращает значение -1 и задает для errno значение EILSEQ.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта. Дополнительные сведения см. в разделе setlocale. Версии этих функций без суффикса _l используют текущий языковой стандарт для данного поведения, зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако они используют переданный параметр языкового стандарта. Дополнительные сведения см. в разделе Locale.

Требования

Маршрут Обязательный заголовок
strlen <string.h>
wcslen <string.h> или <wchar.h>
_mbslen, _mbslen_l <mbstring.h>
_mbstrlen, _mbstrlen_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// crt_strlen.c
// Determine the length of a string. For the multi-byte character
// example to work correctly, the Japanese language support for
// non-Unicode programs must be enabled by the operating system.

#include <string.h>
#include <locale.h>

int main()
{
   char* str1 = "Count.";
   wchar_t* wstr1 = L"Count.";
   char * mbstr1;
   char * locale_string;

   // strlen gives the length of single-byte character string
   printf("Length of '%s' : %d\n", str1, strlen(str1) );

   // wcslen gives the length of a wide character string
   wprintf(L"Length of '%s' : %d\n", wstr1, wcslen(wstr1) );

   // A multibyte string: [A] [B] [C] [katakana A] [D] [\0]
   // in Code Page 932. For this example to work correctly,
   // the Japanese language support must be enabled by the
   // operating system.
   mbstr1 = "ABC" "\x83\x40" "D";

   locale_string = setlocale(LC_CTYPE, "Japanese_Japan");

   if (locale_string == NULL)
   {
      printf("Japanese locale not enabled. Exiting.\n");
      exit(1);
   }
   else
   {
      printf("Locale set to %s\n", locale_string);
   }

   // _mbslen will recognize the Japanese multibyte character if the
   // current locale used by the operating system is Japanese
   printf("Length of '%s' : %d\n", mbstr1, _mbslen(mbstr1) );

   // _mbstrlen will recognize the Japanese multibyte character
   // since the CRT locale is set to Japanese even if the OS locale
   // isnot.
   printf("Length of '%s' : %d\n", mbstr1, _mbstrlen(mbstr1) );
   printf("Bytes in '%s' : %d\n", mbstr1, strlen(mbstr1) );

}
Length of 'Count.' : 6
Length of 'Count.' : 6
Length of 'ABCァD' : 5
Length of 'ABCァD' : 5
Bytes in 'ABCァD' : 6

См. также

Обработка строк
Интерпретация последовательностей многобайтовых символов
Локаль
setlocale, _wsetlocale
strcat, , wcscat_mbscat
strcmp, , wcscmp_mbscmp
Функции strcoll
strcpy, , wcscpy_mbscpy
strrchr, , wcsrchr_mbsrchr_mbsrchr_l
_strset, , _strset_l_wcsset_l_wcsset_mbsset,_mbsset_l
strspn, , wcsspn_mbsspn_mbsspn_l