문자열이란 메모리 바이트 단위로 연속적으로 저장되어 있는 문자들을 말한다. 예를 들어 "Programming is challenging"를 저장할 수 있다. 여기서 중요한 점은 문자열의 끝 문자는 항상 널 문자(\0)이어야 한다는 점이다. c++는 문자열을 출력할 때 널 문자를 만날 때까지 출력하므로, 이 점을 유의하고 있어야 한다. 문자열을 초기화하는 방법도 여러 가지가 있지만 편한 방법은 이런 거다.
char cat[10] = "Hi, there"
(마지막 문자가 널 문자인 것을 확인할 수 있다.)
문자+열이기 때문에 char 자료형을 사용한다. 이렇게 하면 10번 째 문자는 널 문자로 자동으로 저장이 된다. "Hi, there"의 문자들은 9개다. 만약 []안에 들어간 수가 문자열보다 작으면 어떻게 될까? 바로 에러가 뜬다. 만약에 크면? 남은 문자열 자리에는 모두 널 문자가 들어간다. 또 주의해야 할 것은 문자열은 문자를 저장할 때와는 다르게 큰 따옴표("")를 사용한다는 점이다. 문자는 작은 따옴표('')를 사용했다.
cin을 이용해서 연습을 해보자.
char name[20];
char dessert[20];
cout << "당신의 이름을 입력하세요" << endl;
cin >> name;
cout << "당신이 좋아하는 간식을 입력하세요" << endl;
cin >> dessert;
cout << "당신의 이름은 : " << name << "입니다.";
cout << "당신이 좋아하는 간식은 : " << dessert << "입니다.";
실행 결과.
cin은 위와 같이 사용하고, cin구문에 도달하면 키보드의 입력을 기다린다. 입력을 해주면, name과 dessert에 우리가 입력한 이름이 들어가게 된다. 그러나 이 구문에는 문제가 2가지 있다. 1. 만약 띄어쓰기가 필요하면 어떡할 것인가? 2. 이름이 20자보다 길면 어떡할 것인가?
띄어써서 입력하는 순간 다음과 같이 된다.
내가 좋아하는 간식이 나 자신이 돼버렸다. 간식을 입력할 틈도 없이 구문이 넘어갔다. 이는 띄어쓰기를 널 문자로 받아들이고 name에 'K''I''M''\0' 이렇게 들어갔기 때문이다. 그리고 입력 큐에 남은 WAN JU에서 또 'W''A''N''\0'이 하나의 문자열로 받아들여졌다. 이를 해결하기 위해서 cin.getline()과 cin.get()을 이용한다. 둘은 iostream 라이브러리에 들어있다.
cin.getline()은 Enter키(개행 문자)를 행의 마지막으로 간주한다. 이 함수는 두 개의 매개변수를 받는데, 첫 번째는 저장할 배열의 이름, 두 번째는 입력받을 문자의 갯수이다. 이는 널 문자를 포함하기 때문에 예를 들어 20으로 한다면 실제로 입력할 수 있는 문자는 19개다. 이를 통해 다시 방금 코드를 작성한다면
char name[20];
char dessert[20];
cout << "당신의 이름을 입력하세요" << endl;
cin.getline(name, 20);
cout << "당신이 좋아하는 간식을 입력하세요" << endl;
cin.getline(dessert, 20);
cout << "당신의 이름은 : " << name << "입니다.";
cout << "당신이 좋아하는 간식은 : " << dessert << "입니다.";
실행 결과.
제대로 입력이 가능하다. 만약 cin.get()을 이용하면 어떻게 될까?
간식을 입력할 시간도 없이 출력이 된다. 개행 문자를 버리지 않았기 때문에 그 다음 문자열의 입력으로 바로 쓰인 것이다. 그래서 cin.get()을 사용하고 싶으면 다음과 같이 쓰는 방법이 있다.
cin.get(name, 20);
cin.get();
혹은
cin.get(name, 20).get();
두 가지 방법 모두가 가능하다.
만약 지정된 문자 수보다 길면 어떻게 될까? get(), getline() 모두 입력 큐를 뒤에 남겨둔다.