키보드로 문자열 입력
C++의 문자열
C++응용프로그램에서 가장 많이 다루어지는 데이터 중 하나가 문자열입니다. 그러나 안타깝게도 문자열은 C++의 기본 데이터 타입이 아닙니다. C++에서는 다음 두 방법으로 문자열을 표현합니다.
- C-스트링 - C 언어에서 문자열을 표현하는 방법
- string 클래스 - 문자열을 객체로 다루는 방법, 권장하는 방법
첫 번째 방법 : C-스트링
C-스트링(C-string)은 널 문자('/0' 혹은 0)로 끝나는 char 배열을 말하며, C언어에서 사용하는 문자열 방식입니다. C++에서는 C언어와의 호환성 때문에 C-스트링을 그대로 사용합니다.
char name1[0] = {'G', 'r', 'a', 'c', 'e', '\0'}; // name1은 문자열 "Grace"
char name2[5] = {'G', 'r', 'a', 'c', 'e' }; // name2는 문자열이 아님. 단순 문자 배열
name1은 "Grace"라는 C-스트링 문자열이며, name2는 끝에 '\0' 문자가 없기 때문에 문자열이 아니고 단순 문자 배열일 뿐입니다.
"Grace"는 'G', 'r', 'a', 'c', 'e', '\0'의 6개의 문자들로 구성된 문자열 리터럴(literal)이며, 문자열 리터럴을 직접 배열에 저장하여 다음과 같이 문자열을 만들기도 합니다.
char name3[0] = "Grace";
char name4[] = "Grace"; // name4[] 배열의 크기는 6으로 자동 설정
마지막 '\0'을 추가하기 위해 배열의 크기는 문자수보다 최소한 1은 켜야 하며, 문자수보다 많이 커도 상관없습니다.
char name5[10] = "Grace";
name5[] 배열은 크기가 10이므로 "Grace" 문자열 뒤에 남은 4개의 원소들을 모두 '\0'으로 초기화되지만, '\0' 대신 어떤 값으로 초기화되어도 상관없습니다.
C++ 응용 프로그램은 C-스트링을 다루기 위해 C 프로그래밍에서 사용해왔던 strcpy(), strcmp(), strlen() 등 C 라이브러리 함수들을 그대로 사용할 수 있습니다. 이때 <string>이나 <string.h> 헤더 파일을 include 해야 합니다.
#include <cstring> 또는 #include <string.h>
...
int n = strlen("hello");
<cstring> 헤더 파일은 내부적으로 <string.h>를 include 하기 때문에 이 둘을 거의 같은 것으로 볼 수 있지만, C++ 표준에 따라 <cstring> 해더 파일을 include 하는 것이 바람직합니다. 또한, Visual C++에서 <iostream> 헤더 파일을 include 하면 strcpy(), strcmp(), strlen() 등의 C 함수를 사용할 수 있지만, 리눅스 컴파일러 등 다른 컴파일러에서는 안 될 수 있으므로 C++ 표준안을 지키는 것이 바람직합니다.
cin을 이용한 문자열 입력
cin과 >> 연산자를 이용하여 키보드로부터 간단히 문자열을 입력받을 수 있습니다. 다음은 name[] 배열에 문자열을 입력받는 코드입니다.
char name[6]; // 5개의 문자로 구성되는 문자열을 저장할 수 있는 char 배열
cin >> name; // 키보드에서 문자열을 읽어 name 배열 저장
키보드로 다음과 같이 입력하면
| Grace |
>> 연산자는 name[] 배열에 'G', 'r', 'a', 'c', 'e'의 5개 문자와 널('\0')을 순서대로 삽입하며, name[] 배열은 문자열이 됩니다.
name[] 배열의 크기가 6이기 때문에 사용자는 반드시 5개 이해의 문자만 입력할 수 있습니다. 사용자 6개 이상의 문자를 키보드로 입력하면 name[] 배열에 다 저장할 수 있기 때문에 실행 오류(run-time error)가 발생합니다.
다음 예제는 키보드로부터 이름을 입력받고 다시 화면에 출력하는 사례를 보여줍니다.
#include <iostream>
using namespace std;
int main() {
cout << "이름을 입력하세요>>";
char name[11]; // 한글은 5개 글자, 영문은 10까지 저장할 수 있다,
cin >> name; // 키보드로부터 문자열을 읽는다.
cout << "이름은 " << name << "합니다\n";// 이름을 출력합니다.
}
실행 결과
이름을 입력하세요>>마이클
이름은 마이클합니다
위 에제에서 name[] 배열의 크기가 11이기 때문에, 영문자는 10개까지, 한글은 한문자가 2바이트이므로 5글자까지 저장 가능합니다. 더 이상 많은 문자를 키보드로 입력하면 실행 오류가 발생하고 프로그램은 비정상 종료합니다.
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char password[11];
cout << "프로그램을 종료하려면 암호를 입력하세요." << endl;
while (true) {
cout << "암호>>";
cin >> password;
if (strcmp(password, "C++") == 0) {
cout << "프로그램을 정상 종료합니다." << endl;
break;
}
else
cout << "암호가 틀립니다~~" << endl;
}
}
실행 결과
프로그램을 종료하려면 암호를 입력하세요.
암호>>Java
암호가 틀립니다~~
암호>>C
암호가 틀립니다~~
암호>>C++
프로그램을 정상 종료합니다.
cin과 >> 연산자로 문자열을 입력 받을 때의 허점
>> 연산자를 이용하여 문자열을 입력받는 방법은 쉽고 간단한 반면, 독자들이 유의할 허점이 하나 있습니다. >> 연산자는 공백 문자(white space character)를 만나면 그 전까지 입력된 문자들을 하나의 문자열로 인식합니다. 예를 들면 앞의 예제에서 빈칸을 삽입하여 '마 이 클'로 입력하면 출력 결과는 다음과 같이 됩니다.
| 이름을 입력하세요>>마 이 클 이름은 마입니다. |
>> 연산자는 '마' 문자를 읽은 후 빈칸을 만나, 문자열("마")의 입력이 종료된 것으로 판단하기 때문입니다. 그리고 '이 클'은 키 입력을 기달는 다음 >> 연산자에서 처리됩니다.
cin.getline()을 이용하여 공백이 포함된 문자열 입력
cin 객체의 getline() 멤버 함수를 이용하면 공백이 포함된 문자열을 입력받을 수 있습니다. getline() 함수의 원형은 다음과 같습니다.
| cin.getline(char buf[], int size, char delimitChar) buf : 키보드로부터 읽은 문자열을 저장할 배열 size : buf[] 배열의 크기 delimitChar : 문자열 입력 끝을 지정하는 구분 문자 최대 size-1개의 문자를 입력받거나 delimitChar에 지정된 구분 문자가 입력될 때까지 공백 문자를 포함하여 문자열을 입력받을 수 있습니다. delimitChar로 지정된 문자는 저장되지 않고 cin의 버퍼에서도 사라집니다. 그리고 buf[] 배열에 널 문자('\0')가 덧붙여집니다. |
cin.getline()을 호출하면, delimitChar에 저장된 구분 문자가 입력될 때까지 공백 문자를 포함하여 문자열을 입력받을 수 있습니다. 다음은 <Enter> 키를 구분 문자로 지정하여 문자열을 입력받는 예입니다.
char address[100];
cin.getline(address, 100, '\n'); // <Enter> 키가 입력될 때까지 최대 99개의 문자 입력
cin.getline() 함수의 마지막 매개 변수 delimitChar는 생략할 수 있습니다.
delimitChar의 디폴트 값이 '\n'이므로, 앞의 getline() 호출은 다음과 같이 간소화할 수 있습니다.
cin.getline(address, 100); // cin.getline(address, 100, '\n');과 동일
아래 예제는 cin.getline()을 이용하여 문자열을 입력받는 완성된 소스입니다. 독자들은 getline()의 마지막 매개 변수를 ' '나 '&' 등 다른 문자로 변경하여 잘 작동하는지 실행해보기 바랍니다.
#include <iostream>
using namespace std;
int main() {
cout << "주소를 입력하세요>>";
char address[100];
cin.getline(address, 100, '\n'); // 키보드로부터 주소 읽기
cout << "주소는 " << address << "입니다\n"; // 주소 출력
}
실행 결과
주소를 입력하세요>>컴퓨터시 프로그램구 C++동 스트링 1-1
주소는 컴퓨터시 프로그램구 C++동 스트링 1-1입니다
두 번째 방법 : string 클래스
C++ 문자열을 다루는 두 번째 방법은 C++ 표준 라이브러리에서 제공하는 string 클래스를 사용하는 방법입니다.
string 클래스는 문자열의 크기에 제약이 없습니다. 또한, string 클래스를 이용하는 방법은 객체지향일 뿐 아니라, C-스트링 방식보다 문자열을 다루기 쉽습니다.
string 클래스는 문자열 복사, 비교, 수정 등 다양한 문자열 연산을 위한 멤버 함수의 연산자를 제공하므로, 응용프로그램은 string 객체를 생성하여 쉽게 문자열을 다룰 수 있습니다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string song("Falling in love with you"); // 문자열 song
string elvis("Elvis Presley"); // 문자열 elvis
string singer; // 문자열 singer
cout << song + "를 부르는 가수는"; // + 로 문자열 연결
cout << "(힌트 : 첫글자는 " << elvis[0] << ")?"; // [] 연산자 사용
getline(cin, singer); // 문자열 입력
if (singer == elvis) // 문자열 비교
cout << "맞았습니다.";
else
cout << "틀렸습니다. " + elvis + "입니다." << endl; // + 로 문자열 연결
}
실행 결과
Falling in love with you를 부르는 가수는(힌트 : 첫글자는 E)?Elvis Pride
틀렸습니다. Elvis Presley입니다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
| 객체 생성과 객체 활용 (0) | 2026.05.31 |
|---|---|
| C++ 클래스 만들기 (0) | 2026.05.28 |
| 키 입력 받기 (1) | 2026.05.22 |
| namespace와 std:: (0) | 2026.05.19 |
| 프로그램의 기본 요소와 화면 출력 (0) | 2026.05.16 |