문자열
- 모든 문자열의 마지막 문자는 반드시 널 문자(\0)여야 함!!
- ex) char fruit1[8] = {'a', 'p', 'p', 'l', 'e'}; // 문자열이 아님
- char fruit2[8] = {'a', 'p', 'p', 'l', 'e', '\0'}; // 문자열임
- 큰 따음표로 묶인 문자열은 마지막에 널 문자가 들어가있음
- C++에 다양한 입력 기능들에도 끝내기 널 문자가 자동으로 추가됨
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout << "이름을 입력하십시오 : \n";
cin >> name;
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin >> dessert;
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";
- cin이 문자열 끝을 인식하는 방법 : 빈칸, 탭, 캐리지 리턴과 같은 화이트 스페이지!
- Polibo Park 이라고 입력 ===> Polibo\0 와 Park\0로 인식함
- 그럼 어떻게 되냐!! 두번째 입력에 Park\0이 들어가니까! 두번째 입력은 받지 않아버림!!!!!!!!!
- 단어 단위가 아닌 한 행의 문자열을 한번에 읽고 싶다면 getline()과 get()을 사용하면 됨.
- 둘 다 전체 입력 행을 읽어줌 ==> 개행문자(\n)이 나올 때까지 읽음!!!
- 그럼 차이점은 무엇이냐?
- getline() : 개행 문자 읽고 폐기
- get() : 개행 문자 읽고 입력 큐에 개행 문자 남겨 둠
★ cin.getline()
cout << "이름을 입력하십시오 : \n";
cin.getline(name, ArSize);
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin.getline(dessert, ArSize);
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";
- 빈칸이 있는 입력이지만, cin과 다르게 개행이 나올 때까지 읽음
- But, 개행 문자 저장 XXXXXX
- 문자열을 배열에 저장할 때, 개행 문자는 널 문자로 대체됨
★ cin.get()
- get()은 getline()과 같이 개행 문자를 만날 때까지 읽지만, 개행 문자를 읽어서 버리지 않고, 입력 큐에 그대로 남겨둠
- 처음 입력을 하고 나면, 개행 문제가 입력 큐에 남아있어서 다음 입력을 못 받음!!!
- ===> 개행 제거 해줘야 함!
cout << "이름을 입력하십시오 : \n";
cin.get(name, ArSize);
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin.get(dessert, ArSize);
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";
- get()의 매개변수 자리를 비워두면 개행 문자이든 뭐든 무조건 문자 하나를 읽음
- 그럼 남아있는 개행 제거 가능가능~~~
- 방법은 아래 코드를 보시오!
cout << "이름을 입력하십시오 : \n";
cin.get(name, ArSize).get();
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin.get(dessert, ArSize).get();
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";
string 클래스
- 문자열을 저장하기 위해 문자 배열 대신 string형 사용 가능
- string 헤더 파일 필요
- 크기를 프로그램이 자동으로 처리 --> 크기 입력X
- 선언만 하면, 길이 = 0
- 입력을 받으면 크기 자동 조절
char char1[20];
char char2[20] = "apple";
string str1;
string str2 = "banana";
cout << "과일 한 종류를 입력하세요 : ";
cin >> char1;
cout << "다른 과일 한 종류를 입력하세요 : ";
cin >> str1;
cout << "아래에 있는 것들은 모두 과일입니다 : \n";
cout << char1 << " " << char2 << " " << str1 << " " << str2 << endl;
cout << char2 << "에서 3번째 글자 : " << char2[2] << endl;
cout << str2 << "에서 3번째 글자 : " << str2[2] << endl;
- string 클래스의 특징
- string 객체 C 스타일 문자열로 초기화 가능
- cin을 사용하여 string 객체에 입력 저장 가능
- cout을 사용하여 출력 가능
- 인덱싱 가능
- 대입 가능!
- string str1;
- string str2 = "apple";
- str1 = str2
- 배열은 대입안되지만! string 객체는 대입 가능!
- 결합 가능!
- string str3;
- str3 = str1 + str2; // 결합된 두 string 객체를 str3에 대입
- str1 += str2; // str1 끝에 str2 추가
string str1 = "banana";
string str2, str3;
cout << "str1 : " << str1 << endl;
str2 = str1;
cout << "str2 : " << str2 << endl;
str2 = "apple";
str3 = str1 + str2;
cout << "str3 : " << str3 << endl;
str3 = " is delicious";
str1 += str3;
cout << "str1 : " << str1 << endl;
- 위와 같은 기능은 C언어에서 사용했던 strcpy(), strcat() 함수와 같음
- 하지만, string 클래스는 크기를 자동으로 할당해주기 때문에, 메모리관련 오류 걱정이 없음!!
- 문자 길이 구할 때는 .size()를 쓰면 됨.
- string 객체 입력하기
- 여기서, getline()의 사용법을 자세히 봅시다!!
- char를 사용할 때에는 cin.getline(name, size)를 사용했음
- 도트(.)표시 : getline() 함수가 istream 클래스를 위한 클래스 메서드임을 나타냄
- 아래 코드를 보면 getline()을 단독으로 쓴 것을 볼 수 있음
- 도트 없음 : getline()이 클래스 메서드가 아님을 나타냄
- size도 안적음!!!! ---> string 객체는 크기를 자동으로 할당 ---> size 필요X
string str;
cout << "입력 이전 str 문자열 길이 : " << str.size() << endl;
cout << "텍스트 한 행 입력 : ";
getline(cin, str); // cin : 표준 입력
cout << "입력한 텍스트 : " << str << endl;
cout << "입력 이후 str 문자열 길이 : " << str.size() << endl;
string을 전달인자로 받는 함수
- 새로운 자료형인 string도 함수의 전달인자로 사용 가능
- 아래 코드는 string 객체를 담은 배열과 그 크기를 전달인자로 받아 출력해주는 함수를 사용하는 예시임
#include <iostream>
#include <string>
using namespace std;
const int SIZE = 5;
void display(const string sa[], int n);
int main()
{
string list[SIZE]; // string 객체 5개를 담는 배열 list
cout << "과일을 " << SIZE << "개 입력하세요:\n";
for (int i = 0 ; i < SIZE ; i++) // 5번 입력 받음
{
cout << i + 1 << " : ";
getline(cin, list[i]);
}
cout << "\n입력한 내용 : \n";
display(list, SIZE);
return 0;
}
// string 배열과 크기를 전달인자 받아 출력해주는 함수
void display(const string arr[], int n)
{
for (int i = 0 ; i < n ; i++)
{
cout << i+1 << " : " << arr[i] << endl;
}
}
'C++' 카테고리의 다른 글
[C++] 주요 vector 함수 (0) | 2025.05.06 |
---|---|
[C++] array 객체와 vector 객체 (0) | 2025.05.06 |
[C++] 파일 입출력 (.txt 파일) (0) | 2025.05.05 |
[C++] cin.fail() | cin.clear() | cin.ignore() (0) | 2025.05.05 |
[C++] 데이터 형변환 (0) | 2025.05.02 |