본문 바로가기

전공 과목/C++

C++의 입력과 문자열

cin과 >> 연산자를 사용한 키 입력

cin 객체

cin은 키보드와 C++ 응용프로그램을 연결하는 C++ 표준 입력 스트림 객체(standard input stream object)이다. 키보드로 입력되는 값들은 모두 cin 객체의 스트림 버퍼로 들어오며, 응용프로그램은 cin 객체로부터 입력된 키 값을 읽는다.

>> 연산자

>> 연산자는 스트림 추출 연산자(stream extraction operator)로 불리며 왼쪽 피연산자인 스트림 객체로부터 데이터를 읽어 오른쪽 피연산자에 지정된 변수에 삽인한다. 스트림 추출 연산자는 본래 정수를 시프트하는 C++의 기본 연산자이지만, <iostream> 헤더 파일에 스트림 추출 연산자로 재정의(operator overloading)되어 있다.

int width;
cin >> width; //(O)
cin >> &width; // (X), width의 주소 값을 주어서는 안된다.


cin은 여러 개의 >> 연산자를 이용하여 여러 값을 입력받을 수도 있다. >> 연산자들은 왼쪽부터 오른쪽으로 순서대로 키보드로부터 입력받는다. 

cout << "너비와 높이를 입력하세요>>";
cin >> width >> height;
cout << width << '\n' << height << '\n';


한 문장에 두 개의 >> 연산자를 이용하여 width와 height에 값을 읽고 출력하는 코드이다.

C++의 문자열

C++ 응용프로그램에서 가장 많이 다루어지는 데이터 중 하나가 문자열이다. 그러나 문자열은 C++의 기본 데이터 타입이 아니다. C++에서는 다음 두 방법으로 문자열을 표현한다.

  • C 스트링 - C언어에서 문자열을 표한하는 방법
  • string 클래스 - 문자열을 객체로 다루는 방법. <권장

첫 번째 방법 : C 스트링

C 스트링(C-string)은 널 문자('\0' 혹은 0)로 끝나는 char 배열을 말하며, C언어에서 사용하는 문자열 방식이다. C++에서는 C 언어와의 호환성 때문에 C 스트링을 그대로 사용한다. 

char name1[6] = {'G', 'r', 'a', 'c', 'e', '\0'}; // name1은 문자열 "Grace"
char name2[5] = {'G', 'r', 'a', 'c', 'e'}; //name2는 문자열 X, 단순 문자 배열

name1에는 '\0'문자로 끝나기 때문에 문자열이지만 name2에는 '\0'로 끝나지 않기 때문에 문자열이 아닌 단순 문자 배열이다.

char name3[6] = "Grace";
char name4[] = "Grace"; // name[] 배열의 크기는 6으로 자동  설정

마지막에 '\0'을 추가하기 위해 배열의 크기는 문자수보다 최소한 1은 커야 하며, 문자수보다 많이 커도 상관없다.

char name5[10] = "Grace";

이 코드를 실행하면 name5의 배열은 다음과 같은 구조가 된다.

name5[] 배열의 크기가 10이므로 "Grace" 문자열 뒤에 남은 4개의 원소 들은 모두 '\0'으로 초기화 되지만, '\0' 대신 어떤 값으로 초기화되어도 상관없다.

C++ 응용 프로그램은 C 스트링을 다루기 위해 C 프로그래밍에서 사용해왔던 strcpy(), ctrcmp(), ctrlen() 등 C 라이브러리 함수들을 그대로 사용할 수 있다. 이때 <cstring>이나 <string.h> 헤더 파일을 include 해야 한다.

#include <cstring> //C++ 표준에 따라 <cstring>을 쓰는 것이 바람직
또는
#include <string.h>

cin과 >> 연산자를 이용하여 키보드로부터 간단히 문자열을 입력받을 수 있다.

cahr name[6]; // 5개의 문자로 구성되는 문자열을 저장할 수 있는 char 배열
cin >> name; // 키보드에서 문자열을 읽어 name 배열에 저장

예제 2-4

예제 2-4에서 name[] 배열의 크기가 11이기 때문에, 영문자는 10개까지, 한글은 한 문자가 2바이트이므로 5글자까지 저장 가능하다. 더 이상 많은 문자를 키보드로 입력하면 실행 오류가 발생하고 프로그램은 비정상 종료한다.

예제 2-5

암호를 입력받기 위해 문자열 char password[11]를 선언하고, cin과 >> 연산자로 암호를 입력받는다. 암호는 "C++"로 하고, 암호를 입력받을 때까지 루프를 돌고, 암호가 입력되면 프로그램을 종료한다.

cin과 >> 연산자로 문자열을 입력 받을 때의 허점

>> 연산자를 이용하여 문자열을 입력받는 방법은 쉽고 간단한 반면, 유의할 점이 있다. >> 연산자는 공백 문자를 만나면 그 전까지 엽력된 문자들을 하나의 문자열로 인식한다.

이름은 입력하세요 >> 마 이 클
이름은 마입니다

>> 연산자는 '마' 문자를 읽은 후 빈칸을 만나, 문자열("마")의 입력이 종료된 것으로 판단하기 때문이다. 그리고 '이 클'은 키 입력을 기다리는 다음 >> 연산자에서 처리된다.

cin.getline()을 이용하여 공백이 포함된 문자열 입력

cin 객체의 getline() 멤버 함수를 이용하면 공백이 포함된 문자열을 입력받을 수 있다. getline() 함수의 원형은 다음과 같다.

cin.getline(char buf[], int size, char delimitChar)

  • buf : 키보드로부터 읽은 무자열을 저장할 배열
  • size : buf[] 배열의 크기
  • delimitChar : 문자열 입력 끝을 지정하는 구분 문자

최대 size - 1개의 문자를 입력받거나 delimitChar로 지정된 문자를 만나면 문자열의 입력이 종료된다. 입력된 문자열은 buf[] 배열에 저장되며, delimitChar로 지정된 문자는 저장되지 않고 cin의 버퍼에서도 사라진다. 그리고 buf[] 배열에 널 문자 ('\0')가 덧붙여진다.

char address[100];
cin.getline(address, 100, '\n'); // <Enter> 키가 입력될 때까지 최대 99개의 문자 입력

cin.getline() 함수의 마지막 매개 변수 delimitChar는 생략할 수 있다. delimitChar의 디폴드 값이 '\n'이므로, 앞의  getline() 호출을 다음과 같이 간소화 할 수 있다.

cin.hetline(address, 100); // cin.getline(address, 100, '\n');과 동일

예제 2-6

두 번째 방법 : string 클래스

C++에서 문자열을 다루는 두 번째 방법은 C++라이브러리에서 제공하는 string 클래스를 사용하는 방법이다. C 스트링은 배열의 크기에 의해 문자열의 크기가 고정되는 불편함이 있지만 string 클래스는 문자열의 크기에 제약이 없다. 또한 string 크래스를 이용하는 방법은 객체 지향적일뿐 아니라 C 스트링 방식보다 문자열을 다루기 쉽다. 그리고 java, C# 등 다른 언어에서도 string과 유사한 클래스로 문자열을 다루기 때문에, 다른 언어를 배우기 쉬운 장점도 있다.

예제 2-7

 

'전공 과목 > C++' 카테고리의 다른 글

위임 생성자  (0) 2019.09.22
클래스와 생성자  (0) 2019.09.12
C++의 출력 cout  (0) 2019.09.03