HOWTO · C++

C++에서 문자열 길이 찾기

이 기사에서는 C++에서 문자열의 길이를 찾는 방법을 소개합니다. length()와 size() 같은 내장 함수와 사용자 정의 루프 방식을 비롯한 다양한 방법을 살펴봅니다. 실용적인 코드 예제와 자세한 설명을 통해 C++ 프로그램에서 문자열 데이터를 효과적으로 관리하는 방법을 알아보세요.

이 페이지의 내용

std::string의 경우, length() 또는 size()를 호출해 저장된 char 요소의 수를 얻습니다. 두 멤버 함수는 같은 개수를 반환합니다. 예를 들어, 문자열 "Hello, C++!"는 11개의 요소를 가집니다.

#include <iostream>
#include <string>

int main() {
    const std::string message = "Hello, C++!";
    std::cout << message.length() << '\n';
}
11

아래 예제들은 표준 C++ 헤더와 독립적인 main 함수를 사용합니다. 각 출력은 그 예제가 출력하는 개수를 보여 줍니다.

length()로 std::string 길이 얻기

문자열에 저장된 요소 개수를 묻고 싶을 때 length()를 사용합니다. 이것은 문자열 안의 char 요소 수를 반환합니다. 그 개수에는 저장된 값의 일부인 내장 널 요소도 포함됩니다. C 문자열 함수처럼 첫 번째 \0에서 멈추지 않습니다.

결과는 char 요소의 개수이며, 사용자가 인식하는 문자 수나 유니코드 코드 포인트 수와는 다를 수 있습니다. UTF-8 텍스트는 표시되는 한 문자에 여러 char 요소를 사용할 수 있습니다. 문자열의 저장된 길이에는 length()를 사용하고, 작업에 텍스트 문자 개수가 필요할 때는 유니코드를 인식하는 연산을 선택하세요.

size()로 std::string 길이 얻기

size()는 std::string에 대해 length()와 같은 수를 반환합니다. 가독성이나 주변 코드에 따라 어느 표기를 선택해도 됩니다. 성능 때문에 어느 하나를 선호할 필요는 없습니다. size()는 표준 컨테이너에서도 흔히 사용되며, 요소의 개수를 알려 줍니다.

#include <iostream>
#include <string>

int main() {
    const std::string language = "C++ strings";
    std::cout << language.size() << '\n';
}
11

std::string을 사용하려면 <string>을 포함하고, 이 예제의 결과를 std::cout에 쓸 때는 <iostream>을 포함하세요.

범위 기반 for 루프로 std::string 요소 세기

범위 기반 for 루프는 문자열의 각 요소를 셀 수 있습니다. 이것은 반복이 어떻게 동작하는지 배울 때나 각 요소에도 처리가 필요할 때 유용합니다. 일반적인 길이 조회에서는 length()와 size()가 의도를 직접 표현합니다.

#include <cstddef>
#include <iostream>
#include <string>

std::size_t countElements(const std::string& value) {
    std::size_t count = 0;
    for (char element : value) {
        ++count;
    }
    return count;
}

int main() {
    const std::string value = "count me";
    std::cout << countElements(value) << '\n';
}
8

이 루프는 내장 널 요소를 포함해 저장된 모든 char 요소를 방문합니다. std::size_t는 컨테이너 크기와 인덱스에 사용되는 표준 부호 없는 타입입니다.

while 루프로 널 종료 문자열 세기

수동 while 루프는 널 종료 문자 시퀀스, 흔히 C 문자열이라 불리는 것에 적용됩니다. 루프는 종료 널 문자에 도달할 때까지 전진합니다. 그 포인터는 터미네이터를 포함하는 유효한 시퀀스를 가리켜야 합니다. 그런 보장이 없는 임의의 포인터는 이 방식으로 안전하게 순회할 수 없습니다.

#include <cstddef>
#include <iostream>
#include <string>

std::size_t countUntilNull(const char* text) {
    std::size_t count = 0;
    while (text[count] != '\0') {
        ++count;
    }
    return count;
}

int main() {
    const std::string value = "C++ strings";
    std::cout << countUntilNull(value.c_str()) << '\n';
}
11

c_str()는 문자열의 널 종료 표현에 대한 포인터를 제공합니다. 루프는 첫 번째 널 문자 앞부분만 세므로, std::string에 내장 널이 포함되어 있으면 저장된 전체 길이와 다를 수 있습니다.

널 종료 문자열에 std::strlen 사용하기

C 라이브러리 함수 std::strlen은 입력이 이미 유효한 널 종료 바이트 문자열일 때의 또 다른 선택지입니다. 그 선언을 위해 <cstring>을 포함하세요. 이것은 첫 번째 널 문자 앞의 바이트를 세므로, 내장 널 요소를 포함할 수 있는 std::string의 저장된 전체 길이가 필요할 때 length()의 대체재가 아닙니다.

#include <cstring>
#include <iostream>
#include <string>

int main() {
    const std::string value = "C++ strings";
    std::cout << std::strlen(value.c_str()) << '\n';
}
11

std::string의 c_str() 결과는 널 종료되어 있습니다. 독립적인 const char*의 경우, std::strlen은 그 포인터가 유효한 널 종료 시퀀스를 가리킬 것을 요구합니다. 그렇지 않으면 그 스캔이 사용 가능한 저장 공간을 넘어 읽을 수 있습니다.

올바른 문자열 길이 메서드 선택하기

std::string의 경우, length() 또는 size()를 사용해 저장된 char 요소 개수를 얻으세요. 둘은 동등하며, <string>이 문자열 타입을 선언합니다. 세면서 요소를 가르치거나 처리할 때는 범위 기반 루프를 사용하세요.

C 문자열의 경우, 입력이 유효하고 널 종료되어 있으면 std::strlen을 사용하거나, 순회를 설명하기 위해 while 루프를 사용하세요. 둘 다 첫 번째 널 문자에서 멈춥니다. std::string 메서드는 내장 널을 포함해 저장된 요소를 셉니다. 이 개수들 중 어느 것도 유니코드 문자의 일반적인 개수와 혼동해서는 안 됩니다.