My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


파이썬 유저를 위한 C++ (4) - 문자열, string 클래스

7) 문자열

C++에서는 문자열을 두 가지 방법으로 생성할 수 있습니다.

하나는 C언어 스타일 (리터럴한 방식)이고, 나머지는 string 클래스를 이용한 방식입니다.

7-1. C언어 스타일의 문자열 생성

  • char형 배열을 이용하여 생성
  • 반드시 끝을 알려줘야함. (쓰레기값과 문자열을 구분하기 위함)
    • Null 문자
  • but, 배열이므로 생성될 문자열의 길이를 제한해야 한다는 것!

7-2. 문자열 생성 예제(C언어 스타일)

추가 참고 링크 : https://modoocode.com/191, https://modoocode.com/193, Quora

const int SIZE = 20;
char str_arr[SIZE];

int main() {
	//std::cin >> str_arr;
	std::cin.get(str_arr, SIZE).ignore(SIZE, '\n');
	std::cout << str_arr;
	return 0;
}

문자열을 일일이 {'a','b','c',...} 이런식으로 넣을수는 없으니.. std를 이용해서 직접 입력하는 경우가 많습니다.

  1. std::cin : 표준 입력 스트림

    • white space ("", \t, \n) 간격으로 입력을 구분함(delimeter).
  2. istream.get(*char s, streamsize n, char delim)

    • 주어진 streamsize-1 개 까지 전부 받아들임

    • std::cin에서 취급하는 delimeter 대신에 delim을 자체적으로 지정할 수 있음

      (기본값 = \n)

    • 그러나, 문제점은 delim은 stream에 그대로 남아있다는 것.

      => 만약 20개만 받아야하는데 25개를 줬다면, 5개는 그대로 스트림에 남아있기 때문에 다음 입력에 자동으로 들어가게 됩니다.

  3. istream.ignore(streamsize n, char delim)

    • n번째 이후에 스트림에 남아있는 입력값들을 지워줌.

ignore를 사용할지 말지는 상황마다 다르기 때문에 알아서 판단하는게 중요합니다.

7-3. 만약 string 클래스를 이용하면?

get, ignore 복잡하게 생각할 필요 없이 getline함수 하나로 편하게 받을 수 있습니다.

#include <string>

int main() {
	std::string name, address;
	
    std::getline(std::cin, name);
    std::getline(std::cin, address);
    
    std::cout << name << std::endl;
    std::cout << address << std::endl;
    return 0;
}

7-4. string 클래스

#include <string>

int main(){
    std::string str1;
    str1 = "C++ programming";
}

char형 배열을 쓸 필요 없이, 그냥 파이썬처럼 리터럴하게 문자열을 가져올 수 있습니다.

  • str.length() : 길이를 확인하는 메서드
  • 인덱싱 가능
  • =+ 메서드를 이용하여 문자열 대입, 결합 가능
  • std::getline() 메서드를 이용하여 문자열을 행단위로 읽을 수 있음.

흡사 파이썬이랑 비슷해서 편한지 모르겠지만.. C문법보다는 훨씬 편리하다고 합니다.

7-5. string 클래스의 메서드들

  • append(추가할 문자열, 시작위치, 개수) : 맨 끝에 문자열 추가하는 메서드.

  • find(찾을 문자열, 시작위치)

  • str1.compare(str2): 사전식 순서(lexiographical order)대로 str1이 앞에 있는지 판단하는 메서드

  • str.replace(시작위치, 문자열 길이, 새로운 문자열)

    1. str의 시작위치부터 문자열 길이만큼 제거
    2. 시작위치에 새로운 문자열 삽입

    파이썬의 replace 메서드와는 용법이 약간 다른 느낌입니다. 파이썬에서는 해당하는 패턴을 전부 바꿔주는 느낌이었는데요.. 자바스크립트의 splice와 비슷해보입니다.

comments powered by Disqus