안녕하세요, 여행벌입니다.

 

오늘은 그동안 알고리즘 문제를 풀면서, 유용하게 사용하던 string library를 정리하려고 합니다.


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

 

1. C언어 스타일의 문자(배)열

2. string 클래스를 이용한 문자열

 

C언어와는 다르게 C++에서는 string library에서 string 클래스를 지원해주는데요.

문자열을 다룰 때, 배열을 선언하지 않아도 되고, 너무 유용한 것 같습니다!

 

C언어 스타일의 문자(배)열을 이용한다면 문제점이 생기는데요!

이름이랑, 주소를 입력받아 출력하는 예제를 생각해볼까요?

#include<iostream>

int main(void) {
	char name[20];
	char address[20];
	std::cout << "자신의 이름과 살고 있는 도시를 적어주세요.\n";
	std::cin >> name >> address;
	std::cout << "이름 : " << name << '\n' << "주소 : " << address;
}

 

바로 문자 배열의 마지막에는 '\n' 이 들어가 있기 때문에, 이름과 주소를 19글자까지 밖에 입력받지 못한다는 점입니다.

출력 결과 :
자신의 이름과 살고 있는 도시를 적어주세요.
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
이름 : abcdefghijklmnopqrs
주소 : ABCDEFGHIJKLMNOPQRS

 

C++에서는 크기가 고정되지 않은 string 클래스를 이용해 문제를 해결할 수 있습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string name, address;
	std::cin >> name >> address;
	std::cout << name << '\n' << address;
}
출력 결과 :
자신의 이름과 살고 있는 도시를 적어주세요.
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
이름 : abcdefghijklmnopqrstuvwxyz
주소 : ABCDEFGHIJKLMNOPQRSTUVWXYZ

 

훨씬 편하죠?! C++은 문자열 다루기도 너무 편한 것 같습니다!

 

예시를 조금만 더 볼까요?

string input1 변수에 "abcde"를 저장했다고 해봅시다!

그러면 첫 번째 글자인 a 와 세 번째 글자인 c를 출력하고 싶다면 어떻게 해야 될까요?

문자 배열을 다룰 때랑 똑같이 하면 됩니다!

#include<iostream>
#include<string>

int main(void) {
	std::string input1 = "abcde";
	std::cout << input1[0] << " " << input1[2];
}
출력 결과 :
a c

 

이제 String에 대해서 자세히 배워보도록 할까요?

 

1.문자열 처리 - 복사

C언어에서는 문자열1을 문자열2에 대입하기 위해서는 strcpy / strncpy 함수를 이용해야 합니다.

하지만 C++에서는 쉽게 문자열 대입을 할 수 있습니다.

예제를 통해 확인하겠습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1 = "abcde", input2;
	input2 = input1;
	std::cout << input2;
}

 

input1에 "abcde"를 저장하고, input2에 input1을 복사하고 싶습니다.

과연 input2 = input1; 을 하면 알아서 복사가 될까요?

출력 결과 :
abcde

 

출력 결과를 보시면 에러 없이 input2에 "abcde"가 복사된 것을 보실 수 있습니다.

 

2. 문자열 처리 - 이어붙이기

또, C언어에서는 문자열1 뒤에 문자열2를 이어 붙이고 싶으면, strcat / strncat 함수를 이용해야 합니다.

하지만, C++에서는 간단하게 두 문자열을 이어붙일 수 있습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1 = "abcde", input2 = "fghijklmn";
	std::string input3 = input1 + input2;
	std::cout << input3;
}

input1 과 input2를 '+' 연산자를 통해 과연 이어 붙일 수 있을까요?

출력 결과 :
abcdefghijklmn

 

별다른 함수를 사용하지 않고도, 쉽게 이어붙일 수 있습니다!

 

3. 문자열 입/출력 - cin, cout, getline

C++에서는 printf / scanf 대신에 cout / cin 을 이용해 입력, 출력을 처리합니다.

과연, cin 은 띄어쓰기를 어떻게 받아들일까요?

이름과 주소를 입력받아 출력하는 경우에 대해서 생각해보도록 하겠습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1, input2;
	std::cout << "주소를 입력해주세요.\n";
	std::cin >> input1;
	std::cout << "이름을 입력해주세요.\n";
	std::cin >> input2;
	std::cout << "입력 받은 주소 : " << input1 << '\n';
	std::cout << "입력 받은 이름 : " << input2 << '\n';
}

입력 주소에는 '동대문구 왕산로 37길 47', 입력 이름에는 '홍길동 짱짱맨'을 입력한다고 해봅시다.

다음과 같은 출력을 예상할 수 있을 것입니다.

예상 출력 결과 :
주소를 입력해주세요.
동대문구 왕산로 37길 47
이름을 입력해주세요.
홍길동 짱짱맨
입력 받은 주소 : 동대문구 왕산로 37길 47
입력 받은 이름 : 홍길동 짱짱맨

하지만, 예상과는 다르게 출력이 되는데요!

출력 결과 :
주소를 입력해주세요.
동대문구 왕산로 37길 47
이름을 입력해주세요.
입력 받은 주소 : 동대문구
입력 받은 이름 : 왕산로

 

심지어, 두 번째, 이름에 대한 입력은 입력도 안 받은 것 같은데요?

그 이유는 '띄어쓰기' 때문입니다.

cin 함수는 띄어쓰기와 개행(Enter)를 기준으로 입력을 나눠서 받는데요!

동대문구 왕산로 37길 47에서 동대문구하고 띄어쓰기가 있기 때문에 동대문구만 input1에

왕산로하고 띄어쓰기가 있기 때문에 왕산로만 input2에 저장이 된 것입니다.

 

그렇다면, 제대로 된 출력을 받기 위해서는 어떻게 해야 될까요?

getline 함수를 이용해야 합니다!

띄어쓰기를 포함해서 한 줄을 입력받겠다는 뜻입니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1, input2;
	std::cout << "주소를 입력해주세요.\n";
	getline(std::cin, input1);
	std::cout << "이름을 입력해주세요.\n";
	getline(std::cin, input2);
	std::cout << "입력 받은 주소 : " << input1 << '\n';
	std::cout << "입력 받은 이름 : " << input2 << '\n';
}
출력 결과 :
주소를 입력해주세요.
동대문구 왕산로 37길 47
이름을 입력해주세요.
홍길동 짱짱맨
입력 받은 주소 : 동대문구 왕산로 37길 47
입력 받은 이름 : 홍길동 짱짱맨

 

제대로 출력이 되죠??

 

그러면, 이제 string library에 있는 함수들에 대해서 정리해보도록 하겠습니다.

 

4. length() 함수

문법구조 : 'string이름.length()' 이고 반환 값은 int형 입니다.

이름 그대로 string의 길이를 반환해주는 함수입니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1;
	std::cin >> input1;
	std::cout << input1.length();
}
출력 결과:
abcde
5

 

이 함수는 알고리즘 문제를 풀 때, 가장 많이 쓰는 것 같습니다.

 

5. stoi() 함수

문법구조 :' stoi(string 변수 이름)' 이고 반환 값은 int형입니다.

말 그대로 string to integer의 약자이고

Char 0~9로 이루어진 string을 integer로 바꿔주는 함수입니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1;
	std::cin >> input1;
	std::cout << stoi(input1);
}
출력 결과:
변환하고 싶은 숫자로 이루어진 문자열을 입력하시오.
12345
12345

 

위의 12345는 문자열이고, 아래의 12345는 int형입니다!

주의해야 할 점은, int형으로 반환한다는 점입니다!

int형의 양수 최대 값인 2,147,483,647을 넘는 값을 입력하면 프로그램이 에러가 나겠죠?

출력 결과:
변환하고 싶은 숫자로 이루어진 문자열을 입력하시오.
2147483648

2147483648을 입력하면 프로그램이 에러 코드와 함께 멈추는 것을 확인할 수 있을 겁니다.


String library에는 많은 함수가 있기 때문에, 오늘은 여기까지만 정리하도록 하고

다음 포스팅에서 이어서 공부해보도록 하겠습니다.

 

 

 

 

 

 

+ Recent posts