본문 바로가기

Language/C++ 그때그때 끄적끄적

[C++] 문자열 나누기 spring split

다른언어에서는 split 기능이 제공되는 언어가 많습니다 하지만 C++에서는 구현해서 사용해야 하기때문에 문자열을 나누는 방법을 적어두려합니다 방법은 두가지로 find + substr 그리고 stringstream을 활용하는 방법 두가지를 준비했습니다

 

1. find + substr

#include<string>
#include<iostream>

using namespace std;

int main()
{
	string temp = "Hello string split";
	int prev = 0;	// 이전 위치
	int cur;	// 현재 위치
	cur = temp.find(' ');
	while (cur != string::npos)
	{
		string substring = temp.substr(prev, cur - prev);
		cout << substring << endl;
		prev = cur + 1;
		cur = temp.find(' ', prev);
	}
	cout << temp.substr(prev, cur - prev);		// 나머지 문자열 출력
}

 

 

string.find('찾고자하는 문자', 시작 문자열index값)

// 해당 string 문자열에 시작 문자열index위치에서 시작해서 찾고자 하는 문자를 찾아 몇번째 인자인지 return 해줍니다

 

string ::npos 

// 찾고자 하는 문자열이 없을경우 반환되는 값

 

string.substr(시작점 index,마지막지점 index)

// 첫 인자부터 두번째 인자까지의 문자열까지 리턴함

 

  • find로 나눌 지점을 찾음
  • substr를 통해 문자열을 나눠줌
  • 문자열을 나눈후 prev를 1칸(해당 코드는 띄어쓰기를 기준으로 했기에 1칸) 밀어  분기점 검사를 다시 진행함
  • 해당코드는 마지막 문자열은 따로 출력해 줄 수없기에 마지막에 한번 출력해줘야한다

 

2. stringstream

stringstream으로 문자열을 자를때는 공백과 \n을 기준으로 자르기때문에 문자열을 나누는 기점이 그외의 다른 방식이라면 stringstream외의 다른 방식으로 처리하는것이 좋다 그렇다면 stream이란 무엇인가?

 

https://tcpschool.com/cpp/cpp_io_streamBuffer

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

스트림(stream)

위의 링크로 들어가면 자세하게 설명되어있습니다

간단하게 설명하자면 프로그램으로 들어오는 다양한 입력이나 표현을 처리하는 가상의 연결 고리라는 중간 매개자가 stream입니다

 

#include <string> 
#include <sstream> 
#include <iostream> 
using namespace std;
int main()
{
    string s;		// 뽑아내고자 하는 변수 타입에 마춰서 선언
    string str = "I M DongSu\nHello World";
    stringstream stream(str);//초기화 ->stream에 str을 대입. 
    while (stream >> s)
    { 
        //뽑아내고자 하는 string type을 출력한다.(s가 string type이기 때문에) 공백이나 \n이 나올때 까지 읽어드린 후 출력 
        cout << s << endl;
    }
}
// 출력 : //I //M //DongSu //Hello //World

stream에서 >>는 추출연산자 입니다

while(stream >>s)이부분이 어떻게 실행되나 궁금해서 검색해보니

기반이 되는 클래스인 std::basic_ios는 스트림의 유효성을 나타내는 bool을 반환하는 메서드를 제공한다고합니다

이때 읽기가 문자를 가져오지 않고 파일 끝에 도달한 경우 !fail()을 반환하는데 이때 조건이 거짓이기 때문에 false를 반환하게 되는 구조인거같습니다

간단하게 말해 입력 작업이 성공한 경우에만 루프를 실행한다고 합니다

https://stackoverflow.com/questions/28505276/why-does-whilestdifstream-s-work

 

Why does while(std::ifstream >> s) work?

I've used statements such as this quite a bit in my C++ programming: std::string s; std::ifstream in("my_input.txt"); if(!in) { std::cerr << "File not opened" << std::endl; exi...

stackoverflow.com

 

 

  • <sstream>을 선언
  • 나눌 문자열을 steam()에 넣어줍니다
  • 뽑아내고자하는 변수형에 마춰서 string type을 출력합니다

'Language > C++ 그때그때 끄적끄적' 카테고리의 다른 글

[C++]Constexpr  (0) 2024.02.19
[C++] range based for(범위 기반 for문)  (0) 2023.05.16
[C++] Iterator 반복자  (0) 2023.05.10
[C++]람다식이란  (0) 2022.05.11
[C++]Struct 와 Class  (0) 2022.01.18