C언어 스타일의 문자열
C++ 문자열
문자열(string)이란 메모리에 저장된 일련의 연속된 문자(character)들의 집합을 의미합니다.
C++에서는 이러한 문자열을 다음과 같은 두 가지 방법으로 생성할 수 있습니다.
1. C언어 스타일의 문자열
2. string 클래스를 이용한 문자열
C언어 스타일의 문자열
C++에서는 큰따옴표("")를 사용해 표현되는 문자열을 문자열 상수(string constant)라고 합니다.
상수라고 표현하는 이유는 해당 문자열이 이름을 가지고 있지 않으며, 문자열의 내용 또한 변경할 수 없기 때문입니다.
C++에서 문자형 배열을 선언하면 이 배열이 곧 문자열 변수가 됩니다.
널(NULL) 문자
C++에서 문자형 배열로 선언된 문자열 변수는 문자열의 끝을 프로그램에 따로 알려주어야 합니다.
그래야만 프로그램이 실제 문자열에 속한 값과 그 외의 쓰레깃값을 구분할 수 있습니다.
따라서 문자열에 속한 데이터가 끝나면, 문자열의 끝을 의미하는 문자를 하나 더 삽입해 줍니다.
이러한 문자를 널(NULL) 문자라고 하며, '\0'으로 표시하고 아스키코드값은 0입니다.
널 문자의 유무로 문자형 데이터 배열과 실제 문자열을 서로 구분할 수 있습니다.
문자열 입력
C++에서 문자열을 입력받기 위해서는 문자열이 저장될 문자형 배열을 미리 생성해야 놔야 합니다.
예제
const int SIZE = 20;
char address[SIZE];
char name[SIZE];
cout << "자신의 이름을 적어주세요 : ";
cin >> name;
cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin >> address;
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
실행 결과
자신의 이름을 적어주세요 : 홍길동
자신이 살고 있는 도시를 적어주세요 : 서울
서울에 살고 있는 홍길동님~ 감사합니다!
자신의 이름을 적어주세요 : 이 순신
자신이 살고 있는 도시를 적어주세요 : 순신에 살고 있는 이님~ 감사합니다!
위의 예제는 사용자의 이름과 살고 있는 도시명을 입력받는 예제입니다.
하지만 이 예제는 다음과 같은 두 가지 문제점을 안고 있습니다.
1. 이름에 띄어쓰기가 들어가면 도시명을 입력할 수 없습니다.
2. 20바이트 이상의 이름이나 도시명을 입력하면 프로그램이 강제 종료됩니다.
C++에서 cin 객체는 띄어쓰기를 포함한 탭 문자, 캐리지 리턴 문자 등을 모두 문자열의 끝으로 인식합니다.
따라서 띄어쓰기를 포함한 문자열을 전부 입력받으려면 cin 객체의 get() 메소드를 사용하여 다음처럼 수정해야 합니다.
예제
const int SIZE = 20;
char address[SIZE];
char name[SIZE];
cout << "자신의 이름을 적어주세요 : ";
cin.get(name, SIZE).get();
cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin.get(address, SIZE).get();
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
실행 결과
자신의 이름을 적어주세요 : 이 순신
자신이 살고 있는 도시를 적어주세요 : 부산
부산에 살고 있는 이 순신님~ 감사합니다!
위의 예제는 띄어쓰기를 포함한 이름이나 도시명을 정확히 입력할 수 있게 되었습니다.
하지만 아직도 20바이트 이상의 이름을 입력할 경우, 도시명을 입력받지 못하는 문제점을 안고 있습니다.
이 문제는 cin 객체의 ignore() 메소드를 사용하여 다음처럼 수정할 수 있습니다.
예제
const int SIZE = 20;
char address[SIZE];
char name[SIZE];
cout << "자신의 이름을 적어주세요 : ";
cin.get(name, SIZE).ignore(SIZE, '\n');
cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin.get(address, SIZE).ignore(SIZE, '\n');
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
실행 결과
자신의 이름을 적어주세요 : abcdefghijklmnopqrstuvwxyz
자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRS에 살고 있는 abcdefghijklmnopqrs님~ 감사합니다!
위의 예제의 실행결과를 살펴보면, 20바이트 이상의 이름이나 도시명을 입력해도 정확히 20바이트까지만 입력받고 있는 것을 확인할 수 있습니다.
C언어 스타일의 문자열 입력에서는 입력할 문자열의 길이를 미리 알고 있어야만 합니다.
하지만 C++에서 제공하는 string 클래스를 이용하면 다음처럼 아주 간단하게 그 문제를 해결할 수 있습니다.
예제
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string address, name;
cout << "자신의 이름을 적어주세요 : ";
getline(cin, name);
cout << "자신이 살고 있는 도시를 적어주세요 : ";
getline(cin, address);
cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
return 0;
}
실행 결과
자신의 이름을 적어주세요 : 가나다라마바사아자차카타파하
자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ에 살고 있는 가나다라마바사아자차카타파하님~ 감사합니다!
위의 예제는 앞서 살펴본 문자열의 띄어쓰기 문제나 문자열의 길이와 상관없이 모든 문자열을 정확히 입력받을 수 있습니다.
C언어 문자열 처리 함수
C++에서는 C언어 스타일의 문자열을 처리하기 위해 C 라이브러리의 문자열 처리 함수를 사용할 수 있습니다.
이러한 C언어의 문자열 라이브러리를 사용하기 위해서는 우선 cstring 헤더 파일을 포함해야 합니다.
C언어 문자열 처리 함수에 대한 더 자세한 사항은 C언어 문자열 처리 함수 수업에서 확인할 수 있습니다.