티스토리 뷰

IT/C, C++

[C/C++] 문자열 길이 구하기 (strlen, wcslen)

주인장 진빼이

프로그램 개발 중 문자열을 다룰 때 문자열 길이만큼 동적 할당을 한다거나

문자열 길이만큼 복사를 하거나 무언가 작업할 때가 종종 있다.

이때 strlen, wcslen 함수를 호출하여 문자열 길이를 구할 수 있다.

 

MBCS 처리 함수는 stlen, 유니코드 및 WBCS를 지원하는 함수는 wcslen 이다.

 

strlen 함수

string length의 줄임말로 문자열 길이를 의미한다.

정확히 표현하면 MBCS 길이를 구하는 함수이다.

 

문자열의 시작 주소를 매개변수로 전달해주면 문자열 길이를 반환한다.

필요한 인클루드: string.h

 

문자열의 시작 주소에서 NULL을 만나기 전까지 오른쪽(높은 메모리 주소)으로 1칸씩 이동하며 이동할 때마다 1씩 카운팅 한다.

즉, 문자열 시작 주소에서 NULL을 만나는 이전 위치까지의 간격(바이트 수)을 구하는 것이다.

 

함수가 작동되는 과정을 코드와 그림으로 살펴보자.

#include <iostream>
#include <string.h>
int main()
{
  char[] name = "James"
  int n = 30;
  int strLength = strlen(name);
  std::cout << strLength;
  return 0;
}

ANSI 문자열이 차지하고 있는 메모리 데이터를 볼 수 있다.

만약 문자열 길이를 이용해 인덱스로 접근하려면 얻은 문자열 길이에서 -1 해줘야 한다.

위 코드에서 문자열 길이는 5를 반환한다.

 

 

 

wcslen 함수

wide character set length의 줄임말로 유니코드 문자열 길이를 의미한다.

정확히 표현하면 WBCS을 지원하는 문자열 길이를 구하는 함수이다.

 

WCS 문자열의 시작 주소를 매개변수로 전달해주면 문자열 길이를 반환한다.

필요한 인클루드: tchar.h | wstring.h

 

문자열의 시작 주소에서 NULL을 만나기 전까지 오른쪽(높은 메모리 주소)으로 2칸씩 이동하며 이동할 때마다 1씩 카운팅 한다.

즉, 문자열 시작 주소에서 NULL을 만나는 이전 위치까지의 간격에서 나누기 2를 한 것이라 볼 수 있다.

 

아래 그림에서는 NULL을 만나는 이전 위치까지 바이트 수(간격)는 10이며, 10에서 나누기 2를 한 값은 5이다.

즉, 5는 wcslen 함수를 호출하여 문자열 길이를 계산한 반환 값이라 볼 수 있다.

 

마지막 지점을 체크하는 NULL은 2byte 모두 NULL, NULL(\0, \0) 일 때만 감지한다.

#include <iostream>
#include <wstring.h>
int main()
{
  wchar_t name[] = L"James";
  usngiend int strLength = wcslen(name);
  std::cout << strLength;
  return 0;
}

WCS 문자열이 차지하고 있는 메모리 데이터를 볼 수 있다.

만약 문자열 길이를 이용해 인덱스로 접근하려면 얻은 문자열 길이에서 -1 해줘야 한다.

위 코드에서 문자열 길이는 5를 반환한다.

 

 

 

만약에 strlen 함수를 이용해 WCS 문자열의 길이를 구하려면?

그림에 보이는 메모리 데이터를 보면 알 수 있듯이 WCS 문자열은 문자 하나에 2byte를 차지하고 있다.

J 다음 메모리 공간에 곧바로 NULL 문자가 포함되어 있기에 불가능하다고 볼 수 있다.

그러므로 WCS 문자열을 사용한다면 wcslen 함수를 사용해야 한다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함