HOWTO · C++
C++에서 쉼표로 구분된 문자열을 분할하는 방법
std::stringstream 및 std::getline으로, 또는 std::string::find 및 std::string::substr로 C++에서 간단한 쉼표로 구분된 문자열을 분할합니다.
이 페이지의 내용
간단한 쉼표 구분 문자열의 경우, std::stringstream와 std::getline을 사용하는 것이 각 값을 std::vector<std::string>에 수집하는 간단한 방법입니다. 각 조각이 추출되는 방식을 제어해야 하는 경우, std::string::find와 std::string::substr가 수동 대안을 제공합니다. 이러한 접근 방식은 구분 기호를 기준으로 분할합니다. 따옴표로 묶인 필드 내부의 쉼표와 같은 전체 CSV 구문을 구문 분석하지는 않습니다.
std::stringstream 및 std::getline으로 쉼표로 구분된 문자열 분할하기
입력 문자열로부터 스트림을 구성하려면 <sstream>을 포함하고, 조각들을 저장하려면 <vector>를 포함하세요. 쉼표를 std::getline의 세 번째 인수로 전달하세요. 각 호출은 해당 구분 기호까지 읽고 추출된 텍스트를 item에 넣습니다. 루프는 각 항목을 벡터에 추가한 다음 수집된 값들을 출력합니다.
이후 코드에서 토큰을 인덱싱하거나 다시 순회해야 할 때는 std::vector<std::string>를 사용하세요. 추출된 각 값을 입력 순서대로 별도의 문자열로 저장합니다.
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main() {
const std::string input = "apple,banana,cherry,dates";
std::stringstream stream(input);
std::vector<std::string> items;
std::string item;
while (std::getline(stream, item, ',')) {
items.push_back(item);
}
for (const std::string& value : items) {
std::cout << value << '\n';
}
}
apple
banana
cherry
dates
이 예제는 쉼표를 구분 기호로 사용하고 추출된 네 개의 문자열을 순서대로 저장합니다. 구분 기호와 함께 사용하는 std::getline은 연속된 쉼표 사이에 빈 항목을 만들 수 있는 반면, 맨 끝에 있는 구분 기호는 이 루프에서 최종 항목을 만들지 않습니다. 입력에서 이러한 경우를 다르게 처리해야 하는 경우, 각 구분 기호 위치가 무엇을 의미해야 하는지 결정하고 구문 분석 논리에 반영하세요. 추출된 문자열은 입력의 일부인 공백을 그대로 유지하므로, 주변 공백을 버려야 하는 경우 각 항목을 별도로 잘라내세요. 소스에서 세미콜론과 같은 다른 단일 문자를 사용하는 경우 구분 기호 인수를 변경하세요.
std::string::find 및 std::string::substr로 쉼표로 구분된 문자열 분할하기
std::string::find 멤버는 다음 쉼표를 찾고, std::string::substr는 그 앞의 문자들을 복사합니다. 진행하면서 문자를 지우는 대신 원래 입력에 대한 시작 인덱스를 유지하세요. find가 std::string::npos를 반환하면 더 이상 쉼표가 없으므로, 남은 접미사를 최종 항목으로 취하고 중단하세요.
#include <iostream>
#include <string>
#include <vector>
int main() {
const std::string input = "apple,banana,cherry,dates";
std::vector<std::string> items;
std::string::size_type start = 0;
while (true) {
const std::string::size_type comma = input.find(',', start);
if (comma == std::string::npos) {
items.push_back(input.substr(start));
break;
}
items.push_back(input.substr(start, comma - start));
start = comma + 1;
}
for (const std::string& value : items) {
std::cout << value << '\n';
}
}
apple
banana
cherry
dates
마지막 substr(start) 호출이 중요합니다. 마지막 쉼표 뒤의 텍스트를 추가하는데, 여기에는 구분 기호가 더 없을 때의 마지막 값도 포함됩니다. 이 버전은 또한 후행 쉼표가 있는 입력을 최종 빈 항목이 있는 것으로 취급하는데, 이는 위의 스트림 루프와 다릅니다. 완전히 빈 입력에 대해서도 마찬가지로 빈 문자열 하나를 저장하므로, 애플리케이션에서 해당 입력을 값 없음으로 취급해야 하는 경우 루프 조건을 조정하세요. 검색은 각 쉼표 뒤의 문자부터 시작하므로 구문 분석 중에 입력을 변경하는 것을 피할 수 있고, 나중에 사용할 수 있도록 원래 문자열을 쉽게 유지할 수 있습니다. 어느 접근 방식도 따옴표 안의 쉼표나 이스케이프된 따옴표를 처리하지 않습니다. 이러한 규칙이 입력 형식의 일부인 경우 CSV 파서를 사용하세요.