학습 정리/📖 C,C++

[C에서 C++로 넘어가기] - 4. 문자열 입력받기 : String

무딘붓 2023. 1. 4. 14:18

 

C++은 C와 비교해서 더 편리한 기능을 많이 지원하는데, 그 중 하나가 바로 문자열입니다.

char*, char[] 로 문자열을 입력받는 C와는 달리 C++에서는 문자열을 더 쉽게 다룰 수 있습니다.


string

 

string은 C++ STL에서 제공하는 클래스로, 문자열을 다루는 클래스입니다.

( 클래스에 대한 설명은 이전 게시글을 참고해주세요! )

 

string의 특징을 간단하게 정리하면 다음과 같습니다.

  • 문자열 끝에 null문자(‘\0’) 등이 포함되지 않는다.
  • 문자열의 길이를 동적으로 변경 가능하다.
  • 마치 배열처럼 한 문자씩 다룰 수 있다.
  • 사용을 위해서는 string 헤더파일을 선언해야 한다. ( #include <string> )
  • <, >, ==, + 등과 같은 연산자들을 사용할 수 있다. 
    • 문자열 비교 (<, >, ==) : 두 문자열의 사전 순서 비교, 동일 여부를 확인
    • 문자열 연결 (+) : 두 문자열을 이어준다.
  • size, resize, copy등의 함수를 지원한다.

 

C언어에서 문자열을 사용할 때보다 편리해졌다는 점이 보이시나요?

자세한 내용은 하나씩 살펴보도록 합시다.


string 선언하기, 입력하기

 

#include <iostream>
#include <string>
using namespace std;

int main() {
	string str1;			// 빈 문자열 str1 생성
	cin >> str1;			// 공백(space)이전까지의 문자열을 입력받는다.
		
	string str2 = "hello";		// "hello" 로 선언된 str2 생성
	string str3("world");		// "world" 로 선언된 str3 생성
	string str4(str3);		// str3 문자열을 복사한 str4 생성	
	
	cout << str1;        		// 문자열 출력

	return 0;
}

string의 선언 방법이 이해 되시나요?

 

string에 문자열을 입력하는 방법으로는 간단하게 cin을 사용할 수 있지만,

cin은 공백이 있는 문자열을 입력받지 못하는 문제가 있습니다.

cin은 이전 게시글에서 살펴본 것처럼, 공백이나 개행 이전까지의 값만 가져오기 때문입니다.

 

공백이 있는 문자열을 입력 받기 위해서는 getline을 사용하면 됩니다.

cin >> str;		// 공백(space)이전까지의 문자열을 입력받는다.
getline(cin, str);	// 개행('\n')이전까지의 문자열을 입력받는다.
getline(cin, str, 'a')	// 'a'문자 이전까지의 문자열을 입력받는다.

getline(cin, str, 'a') 함수는 'a'문자 이전까지의 문자열을 입력받습니다.

'a'를 입력하지 않으면 기본값으로 'n'으로 설정 되므로, getline(cin,str) 는 getline(cin, str, '\n')과 동일하다고 할 수 있습니다.

마찬가지로 getline(cin, str, ' ')는 cin과 동일하게 작동하게 됩니다.

 

c언어에서와 비교한다면, getline은 c언어의 gets 함수(또는 gets_s)와 비슷한 역할을 한다고 할 수 있겠네요.


string 클래스 문자열 비교, 연결

#include <iostream>
#include <string>
using namespace std;

int main() {
	string str1 = "apple";
	string str2 = "pen";
	string str3 = "pineapple";
	string str4 = "pen";
	cout << (str1 < str2) << ' ' << (str1 > str3) << ' ' << (str1 == str3) << ' ' << (str2 == str4) << endl;
	
	str1 = str1 + str2;
	cout << str1 << '\n';
	str3 = "A " + str3 + " " + str4;
	cout << str3 << '\n';

	return 0;
}

문자열 비교,연결 소스코드 실행결과

 

C++의 string 클래스로 사용하는 문자열은 <, >, ==, + 등과 같은 연산자로 쉽게 비교, 연결이 가능합니다.

C언어에서 strcmp, strcat 함수로 힘들게 문자열을 비교하고 연결하던 것과 비교하면 굉장히 쉬워졌습니다.

 


string 클래스의 멤버 함수

 

string 클래스에서 사용 가능한 유용한 멤버 함수들을 살펴보겠습니다.

아래 내용은  Rebro님의 블로그 를 참고했습니다.

  • str.length() : 문자열 길이 반환
  • str.size() : 문자열 길이 반환 (length와 동일)
  • str.at(index) : index 위치의 문자 반환. 유효 범위인지 체크 O
  • str[index] : index 위치의 문자 반환. 유효 범위인지 체크 X (더 빠름)
  • str.front() : 문자열의 가장 앞 문자 반환
  • str.back() : 문자열의 가장 뒤 문자 반환
  • str.empty() : str이 빈 문자열인지 확인
  • str.append(str2) : str 뒤에 str2 문자열을 이어 붙여줌 ('+' 와 같은 역할)
  • str.find("abcd") : "abcd"가 str에 포함되어있는지를 확인. 찾으면 해당 부분의 첫번째 index를 반환
  • swap(str1, str2) : str1과 str2를 바꿔줌. reference를 교환하는 방식
  • isdigit(c) : c 문자가 숫자이면 true, 아니면 false를 반환 
  • isalpha(c) : c 문자가 영어이면 true, 아니면 false를 반환
  • toupper(c) : c 문자를 대문자로 변환
  • tolower(c) : c 문자를 소문자로 변환