C++ 02 : 문자열 입력받기, cin, getline()

728x90

C++ 02 : 문자열 입력받기, cin, getline()

 

C++은 C와의 호환성으로 인해 문자열을 C-스트링 방식뿐만 아니라 String 클래스를 이용하는 방식도 이용할 수 있다.

<cstring> 헤더 파일을 사용하면 C언어에서 사용하는 strcmp(), strlen(), strcpy()와 같은 함수를 사용할 수 있다.

 

C-스트링 방식 : \0으로 끝나는 문자 배열

char word[5] = {'G','r','a','p','e'};

이러한 형태는 문자열이 아니라 단순 문자 배열이다.

 

문자열로 취급되기 위해서는 마지막에 \0(널문자)를 포함해야 한다.

char word[6] = {'G','r','a','p','e','\0'};
#include <iostream>
using namespace std;
int main() {
    char word[10];
    cout << "값 입력 : ";
    cin >> word;
    cout << "5번째 값 출력 : " << word[4] << endl;
    cout << "6번째 값 출력 : " << word[5];
}

배열에 cin으로 입력 값을 받으면 나머지 공간은 모두 \0으로 초기화된다.

grape는 널문자를 포함해서 6개의 공간이 필요하므로 배열에다가 입력 값을 받으려면 배열의 범위는 최소한 6개 이상이 되어야 한다.

 

다만 이런 입력 방식은 공백을 만나면 입력을 종료한다는 문제점이 있다.

 

#include <iostream>
using namespace std;
int main() {
    char name[11]; // 한글은 2바이트이므로 5개 글자, 영문은 1바이트이므로 10개까지 저장
    cout << "이름 입력 : ";
    cin >> name;
    cout << "이름은 " << name << "입니다.";
}

 

C-스트링 방식으로 공백을 포함한 문자열을 입력받기 위해서는 cin.getline() 함수를 이용해야 한다.

다만 cin과 마찬가지로 배열의 크기는 널문자를 포함한 크기 이상을 선언해야한다.

입력 중에 빈칸이 포함되더라도 지정한 키가 입력 될 때까지 하나의 문자열로 인식한다.

 

cin.getline(변수명, 길이, 지정할 입력종료 키)

#include <iostream>
using namespace std;
int main() {
    cout << "가사를 입력하세요 : ";
    char lyric[100];
    cin.getline(lyric, 100, '\n');
    cout << "가사 출력 : " << lyric;
}

입력 종료 키를 '\n' (개행문자) 로 지정했기 때문에 입력값에 enter가 들어가기 전까지의 모든 값을 문자열로 받는다.

 

 

string 클래스 방식

C++에서 권장되는 방법이다.

스스로 문자열 크기에 맞게 내부 버퍼를 조절하므로 문자열 크기에 대한 고려를 하지 않아도 되는 장점이 있다.

객체 지향적이며 문자열 복사, 비교, 수정 등 다양한 함수를 지원한다.

#include <string>으로 헤더파일을 선언하면 되고,

문자열 관련 함수만 사용한다면 <iostream> 헤더파일 하나만으로도 사용할 수 있다.

 

string 클래스 : 공백을 포함한 문자열 받기 -> getline(변수명, 길이)

 

#include <iostream>
using namespace std;

int main(){
    
    char test[10];
    
    cin.getline(test,10);
    cout << test << endl;
    return 0;
}

0~9까지의 값을 입력하면 0~8까지의 값만 출력된다. 0~8까지 9개의 값과 \0(널문자)값이 test에 들어가기 때문이다.

 

string형을 활용하면 이러한 범위를 신경쓸 필요가 없어진다.

getline(cin, string형 변수명)

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

int main(){
    
    string test;
    
    getline(cin,test);
    
    cout << test << endl;
    return 0;
}

 

가나다라 마바사 아자차 카타파하를 입력하면 그대로 출력된다.

getline(string)형은 \n을 구분자로 인식하기 때문에 공백 문자또한 문자열로 인식할 수 있다.

 

이와 반대로 cin은 '\n', '띄어쓰기', 'tab'를 구분자로 사용하며 버퍼를 지우지 않기 때문에, cin 이후 getline을 사용한다면 cin.ignore()과 같은 함수를 사용하여 버퍼를 비워주어야된다. (아니면 엔터를 입력값으로 받는다.)

 

cin만을 연달아 사용한다면 cin에 공백 무시 함수가 구현되어있기 때문에 버퍼에 공백이 남아있더라도 무시하고 입력받는다.

728x90