공백 기준으로 문자열 나누기

김민수·2025년 2월 11일

C++

목록 보기
66/68

1. getline()을 사용한 문자열 분할

std::getline() 함수는 특정 구분자를 기준으로 문자열을 추출하는 함수다. 기본적으로 개행 문자('\n')를 기준으로 동작하지만, 원하는 구분자를 설정할 수도 있다.

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string input = "Hello world this is C++";
    std::stringstream iss(input);
    std::string buff;

    while (getline(iss, buff, ' ')) {  // 공백(' ')을 기준으로 문자열 분할
        std::cout << buff << std::endl;
    }

    return 0;
}

getline() 방식의 특징

✅ 공백을 기준으로 문자열을 분리
연속된 공백도 빈 문자열로 처리 가능
✅ 사용자가 직접 구분자를 지정 가능
getline()은 기본적으로 string 타입만 지원하며, 숫자로 변환하려면 추가 작업이 필요


2. operator >>를 사용한 문자열 분할

스트림 입력 연산자 >>를 사용하면 공백을 기준으로 자동으로 문자열을 나눌 수 있다.

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string input = "Hello world this is C++";
    std::stringstream iss(input);
    std::string word;

    while (iss >> word) {  // 공백을 자동으로 구분자로 사용
        std::cout << word << std::endl;
    }

    return 0;
}

operator>> 방식의 특징

공백을 자동으로 구분자로 인식
getline()과 달리 연속된 공백을 무시
✅ 문자열뿐만 아니라 int, double 등 숫자 변환도 가능
❌ 연속된 공백을 포함한 빈 문자열을 분리할 수 없음

이 방식은 숫자를 다룰 때 유용하다.

#include <iostream>
#include <sstream>

int main() {
    std::string input = "10 20 30 40 50";
    std::stringstream iss(input);
    int number;

    while (iss >> number) {  // 숫자로 자동 변환
        std::cout << number * 2 << std::endl;
    }

    return 0;
}

3. find()substr()을 사용한 문자열 분할

std::stringfind()substr() 함수를 이용하면 공백을 기준으로 직접 문자열을 분할할 수 있다.

#include <iostream>
#include <string>

using namespace std;

int main() {
    string input = "Hello world this is C++";
    size_t pos = 0;
    string token;
    string delimiter = " ";

    while ((pos = input.find(delimiter)) != string::npos) {
        token = input.substr(0, pos);  // 첫 번째 단어 추출
        cout << token << endl;
        input.erase(0, pos + delimiter.length());  // 앞부분 삭제
    }
    cout << input << endl;  // 마지막 단어 출력

    return 0;
}

find() + substr() 방식의 특징

✅ 문자열을 직접 다룰 수 있음
✅ 원본 문자열을 변형하지 않도록 erase()를 사용하지 않고 substr()을 활용 가능
✅ 다른 구분자를 쉽게 적용할 수 있음
erase()를 사용하면 원본 문자열이 변경됨
❌ 처리 속도가 상대적으로 느릴 수 있음

👉 erase()를 사용하지 않는 방법:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string input = "Hello world this is C++";
    size_t start = 0, end;
    string delimiter = " ";

    while ((end = input.find(delimiter, start)) != string::npos) {
        cout << input.substr(start, end - start) << endl;
        start = end + delimiter.length();
    }
    cout << input.substr(start) << endl;  // 마지막 단어

    return 0;
}

4. 세 가지 방법 비교

방법공백 처리빈 문자열 포함숫자 변환속도
getline()지정한 구분자로 분할✅ 포함 가능❌ 직접 변환 필요보통
operator>>공백 기준 자동 분리❌ 연속된 공백 무시✅ 숫자 변환 가능빠름
find() + substr()직접 구분자 지정 가능✅ 포함 가능❌ 직접 변환 필요느림
profile
안녕하세요

0개의 댓글