C++ 에서 stringstream 사용 방법

C++Beginner
지금 연습하기

소개

이 포괄적인 튜토리얼은 C++ 에서 강력한 stringstream 기능을 탐구하며, 개발자들에게 문자열 조작, 데이터 변환 및 스트림 처리를 위한 필수 기술을 제공합니다. stringstream 를 마스터함으로써 프로그래머는 다양한 형식과 유형의 문자열 데이터를 효율적으로 변환하고 처리할 수 있습니다.

Stringstream 기본

Stringstream 이란 무엇인가?

C++ 에서 stringstream은 문자열을 입력 및 출력 스트림으로 조작할 수 있는 강력한 스트림 클래스입니다. <sstream> 헤더에 포함되어 있으며, 문자열과 다양한 데이터 유형 간의 변환을 쉽게 수행할 수 있습니다.

주요 특징

  • C++ 표준 템플릿 라이브러리 (STL) 의 일부
  • 문자열 기반 입력 및 출력 작업 지원
  • 타입 변환 지원
  • 문자열 데이터를 파싱하고 조작하는 데 유용

필요한 헤더 포함

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

기본 Stringstream 연산

Stringstream 생성

std::stringstream ss;  // 기본 생성자
std::stringstream ss("초기 내용");  // 초기 문자열을 가진 생성자

Stringstream 에 쓰기

std::stringstream ss;
ss << "Hello ";  // 문자열 삽입
ss << 42;        // 정수 삽입
ss << " World";  // 추가 내용 추가

Stringstream 에서 읽기

std::stringstream ss("123 456");
int num1, num2;
ss >> num1 >> num2;  // num1 = 123, num2 = 456

Stringstream 워크플로우

graph TD
    A[입력 문자열] --> B[Stringstream]
    B --> C{파싱/변환}
    C --> D[데이터 유형 추출]

일반적인 사용 사례

사용 사례 설명 예시
타입 변환 문자열과 숫자형 타입 간 변환 문자열을 정수로 변환
문자열 파싱 문자열에서 데이터를 분할 및 추출 CSV 데이터 파싱
입력 유효성 검사 입력을 검사하고 변환 사용자 입력 유효성 검사

성능 고려 사항

  • Stringstream 은 편리하지만 수동 파싱보다 느릴 수 있음
  • 중간 정도의 복잡성을 가진 문자열 조작에 적합
  • 고성능, 빈번한 변환에는 권장되지 않음

권장 사항

  • 작업 후 항상 스트림 상태를 확인
  • 재사용 전 .clear()를 사용하여 스트림을 지움
  • 현재 문자열 내용을 얻으려면 .str() 사용

예제: 포괄적인 Stringstream 사용

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

int main() {
    std::stringstream ss;

    // 스트림에 쓰기
    ss << "온도: " << 25 << " 섭씨";

    // 스트림에서 읽기
    std::string 접두사;
    int 온도;

    ss >> 접두사 >> 온도;

    std::cout << "파싱된 값: " << 접두사 << " " << 온도 << std::endl;

    return 0;
}

LabEx 를 사용하여 C++ 문자열 조작 기술을 향상시켜 보세요!

입력 및 출력 메서드

Stringstream 입력 및 출력 개요

Stringstream 은 다양한 입력 및 출력 작업을 제공하여 원활한 데이터 조작 및 변환을 가능하게 합니다.

입력 메서드

삽입 연산자 (<<)

std::stringstream ss;
ss << "Hello" << 42 << 3.14;  // 여러 유형 삽입

clear() 메서드

std::stringstream ss;
ss << "초기 내용";
ss.clear();  // 오류 플래그 초기화
ss.str("");  // 실제 내용 지우기

출력 메서드

추출 연산자 (>>)

std::stringstream ss("123 45.67");
int num;
double decimal;

ss >> num;       // num = 123
ss >> decimal;   // decimal = 45.67

스트림 상태 관리

graph TD
    A[스트림 연산] --> B{스트림 상태 확인}
    B --> |정상| C[처리 계속]
    B --> |오류| D[오류 처리]

주요 스트림 상태 메서드

메서드 설명 사용 예
good() 오류 발생 여부 확인 if(ss.good())
fail() 오류 발생 여부 확인 if(ss.fail())
eof() 스트림 끝 여부 확인 if(ss.eof())

고급 입력/출력 기법

복잡한 문자열 파싱

std::stringstream ss("Name:John,Age:30,City:NewYork");
std::string key, value;

while(std::getline(ss, key, ':') && std::getline(ss, value, ',')) {
    std::cout << "Key: " << key << ", Value: " << value << std::endl;
}

타입 안전 변환

std::stringstream ss;
int number = 42;
std::string result;

ss << number;
result = ss.str();  // 정수를 문자열로 변환

오류 처리

std::stringstream ss("숫자가 아님");
int value;

if (!(ss >> value)) {
    std::cerr << "변환 실패" << std::endl;
}

성능 고려 사항

  • 문자열 내용을 얻으려면 .str() 사용
  • 스트림 재사용 전 .clear() 사용
  • 고성능 시나리오에서는 수동 파싱을 선호

완전한 예제

#include <sstream>
#include <iostream>
#include <vector>

int main() {
    std::stringstream ss;
    std::vector<int> numbers;

    // 여러 값 입력
    ss << "10 20 30 40 50";

    int num;
    while (ss >> num) {
        numbers.push_back(num);
    }

    // 처리된 데이터 출력
    for (int val : numbers) {
        std::cout << val << " ";
    }

    return 0;
}

LabEx 의 대화형 프로그래밍 환경으로 C++ 기술을 향상시켜 보세요!

실용적인 변환 예제

변환 시나리오

Stringstream 은 다양한 데이터 유형 간의 강력한 타입 변환 기능을 제공합니다.

문자열에서 숫자로 변환

문자열에서 정수로 변환

std::string str = "42";
std::stringstream ss(str);
int number;
ss >> number;  // number = 42

문자열에서 실수로 변환

std::string str = "3.14159";
std::stringstream ss(str);
double value;
ss >> value;  // value = 3.14159

숫자에서 문자열로 변환

정수에서 문자열로 변환

std::stringstream ss;
int number = 123;
ss << number;
std::string str = ss.str();  // str = "123"

여러 타입 변환

std::stringstream ss;
int age = 30;
double height = 1.75;
std::string name = "John";

ss << "Name: " << name
   << ", Age: " << age
   << ", Height: " << height;

std::string result = ss.str();

복잡한 변환 워크플로우

graph TD
    A[입력 문자열] --> B[Stringstream]
    B --> C{파싱/변환}
    C --> D[여러 데이터 유형]
    D --> E[처리된 출력]

변환 기법

기법 입력 출력 예시
문자열에서 정수로 "123" 정수 123
문자열에서 실수로 "3.14" 실수 3.14
정수에서 문자열로 42 "42" 변환

안전한 변환 관행

bool safeConvert(const std::string& input, int& result) {
    std::stringstream ss(input);
    return !!(ss >> result);
}

int main() {
    std::string str = "456";
    int number;

    if (safeConvert(str, number)) {
        std::cout << "변환됨: " << number << std::endl;
    } else {
        std::cout << "변환 실패" << std::endl;
    }

    return 0;
}

복잡한 데이터 구조 파싱

struct Person {
    std::string name;
    int age;
    double salary;
};

Person parsePerson(const std::string& data) {
    std::stringstream ss(data);
    Person p;

    std::getline(ss, p.name, ',');
    ss >> p.age;
    ss.ignore(); // 콤마 건너뛰기
    ss >> p.salary;

    return p;
}

int main() {
    std::string personData = "John Doe,35,50000.50";
    Person person = parsePerson(personData);
}

고급 변환 시나리오

CSV 파싱

std::vector<std::string> splitCSV(const std::string& line) {
    std::vector<std::string> result;
    std::stringstream ss(line);
    std::string item;

    while (std::getline(ss, item, ',')) {
        result.push_back(item);
    }

    return result;
}

변환 시 오류 처리

bool validateConversion(const std::string& input) {
    std::stringstream ss(input);
    int value;

    // 변환 가능 여부 확인
    return (ss >> value) && ss.eof();
}

LabEx 의 대화형 프로그래밍 환경으로 더욱 고급 C++ 기술을 탐구하세요!

요약

결론적으로, stringstream 은 C++ 개발자들에게 문자열 조작, 타입 변환 및 입력/출력 처리를 위한 다재다능하고 강력한 메커니즘을 제공합니다. 그 메서드와 실제 응용 사례를 이해함으로써 프로그래머는 복잡한 문자열 연산 및 데이터 변환을 원활하게 처리하는 더 유연하고 효율적인 코드를 작성할 수 있습니다.