이번 장에서는 C++의 데이터를 입력받는 법을 설명합니다.
C언어 해서는 scanf, gets, getc, getcher 등 사용하지만 앞으로는 다른 방식을 사용할 것입니다.
" cin " 와 " >> 연산자 "
기본적인 입력은 " cin >> 입력변수 " 로 볼 수 있습니다. 뜻은 "콘솔(키보드)로부터 데이터를 입력받아 입력변수에 대입하라"이고 cout 과는 반대의 의미를 가집니다.
cin은 C++ 표준 입력 스트림 객체 (standard input stream object)로 키보드로부터 입력된 값들은 모두 스트림 버퍼에 들어옵니다.
※ 지금은 스트림 버퍼를 단순하게 스트림 = 객체, 버퍼 = 임시 메모리 공간 (버퍼링의 버퍼)라고 생각합시다.
>>연산자는 스트림 추출 연산자(stream extration operator)로써 << 연산자와는 반대로 왼쪽 스트림 객체로부터 데이터를 오른쪽 변수에 저장하는 역할을 합니다.
C언어와 다른 점은 scanf는 입력 타입과 주소 '&'를 신경 써야 했지만 cin과 >>연산자는 cout과 같이 모든 기본 타입에 대해 입력이 가능하며 주소가 아닌 변수 그대로 입력받는 게 특징입니다.
또한 >> 로 여러 데이터를 입력받을 수 있고 왼쪽부터 오른쪽 순서로 읽습니다.
int a;
char b;
cin >> a >> b
cout << a << '\n' << b << endl;
위 코드 실행 시 "3 #"을 입력하면 다음과 같이 출력할 것입니다.
3 |
# |
이때 값의 입력 단위는 스페이스바의 공백과 <enter> 키입니다. 즉, 스페이스나 enter로 입력하려는 값의 종료지점을 구분할 수 있습니다.
문자열 입력
문자는 기본타입으로 있지만, 문자열은 C++의 기본 타입이 아니므로 다음 두 가지 방법으로 나뉩니다.
1. C-스트링 : char형 배열을 생성해 '\0'으로 문장의 끝을 저장하는 방법
2. string 클래스 : 문자열을 객체로 다루는 방법
이번 장에서는 C-스트링 방법을 알아봅니다. string 클래스는 4장에서 다룹니다.
char name_1[6] = {'h','e','l','l','o','\0'} //문자열 "hello"
char name_1[5]= {'h','e','l','l','o'} // 문자 '배열' h,e,l,l,o
char name_3[6] = "hello" // 문자열 "hello"
char name_4[]="hello" //배열 크기 6으로 자동 설정
대표적인 표현인데 C언어와 같이 배열에 한 문자씩 채워지며 (인덱스 0번부터) 나머지 문자가 입력된 후 나머지 빈 공간에는 '\0'이 대신 채워집니다. 문자열을 저장하려면 문자열의 문자의 수에 1을 더한 배열의 크기를 설정해야 합니다.
문자열을 다루는 함수는 C언어에서 <string.h> 헤더파일을 가져왔는데 C++에서는 <cstring> 헤더파일을 가져옵니다.
( <cstring>가 <string.h>을 포함하므로 <string.h>을 가져와도 되지만 C++표준에 따라 <cstring>를 씁시다.)
※ Visual에서 <iostream>만 가져와도 strcmp( ), strlen( ), strcpy( )를 사용할 수 있으나 다른 곳에서는 쓸 수 없을 수도 있으나 문자열 함수를 다룬다면 <cstring>를 include 합니다.
include <iostream>
using namespace std;
int main(){
char name[21]; //한글은 1글자당 2바이트이므로 총 10글자, 영문은 1글자당 1바이트이므로 20글자까지 저장한다.
cin >> name; //키보드로부터 문자열을 받는다.
cout << "입력된 문자열은" << name << "입니다" << endl; //출력하는 부분
}
지금이야 배열의 크기가 작아 잘 보여 실수가 적지만, 복잡한 코드를 작성할 때 의외로 배열의 크기를 생각 못해 오류가 나는 경우가 많습니다.
공백문자의 입력
앞에서 설명했듯이 공백문자는 입력이 끝났다고 인식합니다. 공백문자를 문자열로 입력하기 위해서는 cin 객체의 getline( ) 멤버 함수를 사용하면 됩니다.
cin.getline( ) (char buf [ ], int size, char delimitchar)
- buf [ ] : 콘솔(키보드)로부터 받은 데이터를 저장할 배열
- size : buf [ ]의 크기
- delimitchar : 문자열의 끝을 지정하는 구분 문자
해석하면 "size -1 개의 문자나 delimitchar로 지정한 문자를 입력받으면 해당 문자열은 buf [ ]에 저장하라"이고, 이때 delimitchar로 지정된 문자는 지워지고 '\0'가 buf [ ] 마지막에 붙습니다.
주로 <enter>를 입력의 종료로 하는 경우가 많기에 delimitchar를 '\n'로 지정합니다. delimitchar를 아무것도 지정하지 않은 경우에 '\n'가 자동으로 지정됩니다.
cin.getline(password,100,'\n');
cin.getline(password,100);
// 위의 두 명령어는 같은 의미를 가집니다.
앞의 개념을 이용해 암호를 입력해 맞으면 프로그램 종료 틀리면 반복하는 프로그램을 작성할 수 있습니다.
#include <iostream>
#include <cstring>
using namespace std;
int main( ){
cout << "암호를 입력하세요 (100자리 이내)\n" ;
char password[100];
char key[] = "korea";
while(1){
cout << "입력 :";
cin.getline(password,100);
if(strcmp(password,key)==0){
cout << "정답입니다. 프로그램을 종료합니다." << endl;
break;
} else
cout << "오답입니다." << endl;
}
}
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 4장. #2 this 포인터와 string 클래스 (0) | 2023.12.08 |
---|---|
[C++] 4장. #1 객체 포인터와 객체 배열 (0) | 2023.12.04 |
[C++] 3장. #2 접근 지정자와 인라인 함수 (1) | 2023.12.03 |
[C++] 3장. #1 클래스와 객체 (0) | 2023.12.02 |
[C++] 2장. #1 기본 요소 (0) | 2023.11.28 |