reference:
"명품 C++ Programming" / 황기태
"전문가를 위한 C++" / 마크 그레고리
문자열은 c++의 기본 데이터 타입이 아니다. c++에서는 두 가지 방법으로 문자열을 표현한다.
C-string
C언어에서 문자열 표현하는 방법
널 문자로 끝나는 char형 배열
string 클래스
문자열을 객체로 다루는 방법. 권장하는 방법
C-string은 널 문자('\0' 혹은 0)로 끝나는 char 배열을 말하며, C언어에서 사용하는 문자열 방식이다. c++에서는 c언어와의 호환성 때문에 C-string을 그대로 사용한다.
char name[6] = {'G', 'r', 'a', 'c', 'e' '\0'}; // name 문자열은 "Grace"
char name2[5] = {'G', 'r', 'a', 'c', 'e'}; // 문자열이 아닌 단순 문자 배열
"Grace"는 널 문자 포함 6개의 문자들로 구성된 문자열 리터럴이며, 문자열 리터럴은 직접 배열에 저장하여 문자열을 만들 수 있다.
char name[6] = "Grace";
char name2[] = "Grace"; // name2[] 배열의 크기는 6으로 자동 설정
마지막에 널 문자를 추가하기 위해 배열의 크기는 문자수보다 최소한 1은 커야 하며, 문자수보다 많이 커도 상관없다.
char name[10] = "Grace";
c++ 응용 프로그램은 C-string을 다루기 위해 c 프로그래밍에서 사용해왔던 strcpy(), strcmp(), strlen() 등 c 라이브러리 함수들을 그대로 사용할 수 있다. 이 때 <cstring>이나 <string.h> 헤더 파일을 include 해야 한다.
#include <cstring> // 또는 <string.h>
int n = strlen("Hello");
<cstring>헤더 파일은 내부적으로<string.h>를 include 하기에 이 둘은 거의 같은 것으로 볼 수 있지만, c++ 표준에 따라<cstring>헤더 파일을 include 하는 것이 바람직하다.
또한 Visual C++에서<iostream>만 include 하면 strcpy(), strcmp(), strlen() 등의 함수를 사용할 수 있지만, 리눅스 컴파일러 등 다른 컴파일러에서는 안 될 수 있으므로 C++ 표준안을 지키는 것이 바람직하다.
char name[6]; // 5개의 문자로 구성된 문자열을 저장할 수 있는 char 배열
cin >> name; // 키보드에서 문자열을 읽어 name 배열에 저장
name[] 배열의 크기가 6이기에 사용자는 반드시 5개 이하의 문자만 입력할 수 있다. 사용자가 6개 이상의 문자를 키보드로 입력하면 name[] 배열에 다 저장할 수 없기에 **런타임 오류(run-time error)가 발생한다(=> 비정상 종료).
>> 연산자로 문자열을 입력 받을 때의 허점>> 연산자를 이용하여 문자열을 입력받는 방법은 쉽고 간단하지만 허점이 있다. >> 연산자는 공백 문자를 만나면 그 전까지 입력된 문자들을 하나의 문자열로 인식한다.
cin 객체와 getline() 멤버 함수를 이용하면 공백이 포함된 문자열을 입력받을 수 있다.
cin.getline(char buf[], int size, char delimitChar)
// buf: 키보드로부터 읽은 문자열을 저장할 배열
// size: buf[] 배열의 크기
// delimitChar: 문자열 입력 끝을 지정하는 구분 문자
최대 size-1개의 문자를 입력받거나 delimitChar로 지정된 문자를 만나면 문자열의 입력이 종료된다. 입력된 문자열은 buf[] 문자 배열에 저장되며, delimitChar로 지정된 문자는 저장되지 않고 cin의 버퍼에서 사라진다. 그리고 buf[] 배열에 널 문자가 덧붙여진다.
char address[100];
cin.getline(address, 100, '\n'); // 엔터키가 입력될 때까지 최대 99개의 문자 입력
// '\n'은 디폴트