프로그래밍 언어/C++

C ++에서 문자열을 토큰화 하는 방법

Rateye 2021. 6. 23. 10:30
728x90
반응형
질문 : C ++에서 문자열을 어떻게 토큰화 합니까?

Java에는 편리한 분할 방법이 있습니다.

String str = "The quick brown fox";
String[] results = str.split(" ");

C ++에서이 작업을 수행하는 쉬운 방법이 있습니까?

답변

 


C ++ 표준 라이브러리 알고리즘은 콘크리트 컨테이너가 아닌 반복자를 기반으로하는 매우 보편적입니다. split 기능을 제공하기가 어렵습니다. 비록 아무도 이것이 편리하다고 주장하지 않더라도 말입니다. 그러나 반환 유형은 무엇입니까? std::vector<std::basic_string<…>> ? 그럴 수도 있지만 (잠재적으로 중복되고 비용이 많이 드는) 할당을 수행해야합니다.

대신 C ++는 임의적으로 복잡한 구분 기호를 기반으로 문자열을 분할하는 다양한 방법을 제공하지만 다른 언어만큼 멋지게 캡슐화되지는 않습니다. 다양한 방법으로 전체 블로그 게시물을 채 웁니다 .

가장 간단하게 std::string::find std::string::npos 때까지 std::string::substr 사용하여 내용을 추출 할 수 있습니다.

공백으로 분할하기위한보다 유동적 인 (관용적이지만 기본적인) 버전은 std::istringstream 사용합니다.

auto iss = std::istringstream{"The quick brown fox"};
auto str = std::string{};

while (iss >> str) {
    process(str);
}

std::istream_iterator s를 사용하면 반복기 범위 생성자를 사용하여 문자열 스트림의 내용을 벡터로 복사 할 수도 있습니다.

여러 라이브러리 (예 : Boost.Tokenizer)는 특정 토크 나이저를 제공합니다.

고급 분할에는 정규 표현식이 필요합니다. C ++는 특히 이러한 목적을 위해 std::regex_token_iterator

auto const str = "The quick brown fox"s;
auto const re = std::regex{R"(\s+)"};
auto const vec = std::vector<std::string>(
    std::sregex_token_iterator{begin(str), end(str), re, -1},
    std::sregex_token_iterator{}
);
출처 : https://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c
728x90
반응형