[C++] 문자열, stirng 클래스

꿈별·2022년 11월 2일
0

C++

목록 보기
5/27

✔문자열

메모리에 저장된 일련의 연속된 문자(character)들의 집합


문자열 상수

  • 큰따옴표("")를 사용해 표현되는 문자열
  • 해당 문자열은 이름을 가지고 있지 않고, 내용도 변경할 수 없기 때문에 상수라고 표현함
  • 💡 C++은 문자열의 길이에 제한을 두지 않는다.

널(NULL) 문자

  • 문자형 배열로 선언된 문자열 변수문자열의 끝을 프로그램에게 알려줘야 한다.
  • 문자열에 속한 데이터가 끝나면, 문자열의 끝을 의미하는 문자인 널(NULL) 문자를 삽입한다.
    -> '\0'으로 표시하고 아스키코드 값은 0이다.
  • 널 문자 유무로 문자형 데이터 배열과 실제 문자열을 구분할 수 있다.
    ❗ 문자열을 저장하기 위한 문자형 배열을 선언할 때는 반드시 널 문자까지 포함해서 생각해야 한다.

문자열 입력

  • C++에서 문자열을 입력받으려면 문자열을 저장할 문자형 배열을 미리 생성해 놔야 한다.
const int SIZE = 20;
char menu[SIZE];
char name[SIZE];

cout << "불러드릴 이름은? : ";
cin >> name;
cout << "뭘 시키실 건가요? : ";
cin >> menu;

cout << menu << " 시키신 " << name << "님 음료 나왔습니다~";
[출력]
불러드릴 이름은? : 꿈별
뭘 시키실 건가요? : 바닐라라떼
바닐라라떼 시키신 꿈별님 음료 나왔습니다~

문제점

  • 이름에 띄어쓰기가 들어가면 메뉴를 입력할 수 없다.
  • 20바이트 이상의 문자열을 입력하면 프로그램이 강제 종료된다.
    -> C++의 cin 객체띄어쓰기를 포함한 탭 문자, 캐리지 리턴 문자 등을 모두 문자열의 끝으로 인식한다.
    -> 띄어쓰기를 포함한 문자열을 전부 입력받으려면 cin 객체의 get() 메소드를 사용해야 한다.

get() - 띄어쓰기 문제 개선

const int SIZE = 20;
char menu[SIZE];
char name[SIZE];

cout << "불러드릴 이름은? : ";
cin.get(name, SIZE).get();
cout << "뭘 시키실 건가요? : ";
cin.get(menu, SIZE).get();

cout << menu << " 시키신 " << name << "님 음료 나왔습니다~";
[출력]
불러드릴 이름은? : 꿈 별
뭘 시키실 건가요? : 자허블
자허블 시키신 꿈 별님 음료 나왔습니다~

문제점

  • 여전히 20바이트 이상의 이름을 입력하면 메뉴를 입력받지 못한다.
    -> cin 객체의 ignore() 메소드를 사용해야 한다.

ignore() - 문자열 길이 문제 개선

const int SIZE = 20;
char menu[SIZE];
char name[SIZE];

cout << "불러드릴 이름은? : ";
cin.get(name, SIZE).ignore(SIZE, '\n');
cout << "뭘 시키실 건가요? : ";
cin.get(menu, SIZE).ignore(SIZE, '\n');

cout << menu << " 시키신 " << name << "님 음료 나왔습니다~";
[출력]
불러드릴 이름은? : onetwothreefourfivesixseven
뭘 시키실 건가요? : icevanillalatteandcookie
icevanillalatteandc 시키신 onetwothreefourfive님 음료 나왔습니다~

👉 20바이트 이상의 이름이나 메뉴를 입력해도 정확히 20바이트까지만 입력받는다.

string 클래스 - 띄어쓰기, 문자열 길이 문제 개선

  • C언어 스타일의 문자열 입력에서는 입력한 문자열의 길이를 미리 알고 있어야 한다.
    💡 하지만 C++에서 제공하는 string 클래스를 이용하면 그 문제가 해결된다.
#include <iostream>
#include <string>
using namespace std;

int main(void)
{
    string address, name;

    cout << "불러드릴 이름은? : ";
    getline(cin, name);

    cout << "뭘 시키실 건가요? : ";
    getline(cin, menu);

    cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
    
    return 0;
}
[출력]
불러드릴 이름은? : onetwothreefourfivesixseven
뭘 시키실 건가요? : icevanillalatteandcookie
icevanillalatteandc 시키신 onetwothreefourfive님 음료 나왔습니다~

✔string 클래스

  • 문자형 배열보다 사용이 편리하며, 문자열을 하나의 타입처럼 표현할 수 있게 한다.
  • C++에서 string 클래스를 사용하려면 우선 string 헤더 파일을 포함해야 한다.
  • string 클래스는 std 네임스페이스에 속해 있기 때문에 using 지시자를 사용하거나 해당 네임스페이스를 참조해야 한다.

문자열 선언 및 초기화

  • string 객체를 사용한 문자열 선언 방식
string str1;			//문자열 선언
str1 = "Hello";			//문자열 초기화
string str2 = "hihello"	//문자열 선언과 동시에 초기화
  • string 객체는 문자열을 배열 형태가 아닌 단순한 변수
    로 선언한다.
    -> 사용자가 길이를 명시하지 않아도 됨
    -> 문자열 길이에 대한 문제는 C++ 프로그램이 자동으로 처리함
  • string 객체로 만든 문자열배열처럼 인덱스를 통해 다룰 수 있음

💡 string 클래스의 length() 메소드size() 메소드를 사용하면 string 객체의 현재 길이를 알 수 있다.
❗ 컴퓨터에서의 한글은 2바이트로 취급된다는 점을 주의한다.

문자열 처리

  • stirng 객체를 이용한 문자열 처리는 문자형 배열을 이용하는 방식보다 훨씬 간단하다.
  • C언어 : 문자형 배열 사이의 대입 작업strcpy() 함수strncpy() 함수 사용
  • C++
    : string 객체를 사용한 문자열에서는 대입 연산자만을 사용
#include <iostream>
#include <string>
using namespace std;

int main(void){
	string str1 = "배고파";
	string str2;

	str2 = str1;
	cout << str2;
}
[결과]
배고파

  • C : 문자열 배열 사이 추가나 결합 작업은 strcat()이나 strncat() 함수 사용
  • C++ : string 객체를 이용하면
    복합 대입 연산자(+=) append() 메소드추가나 결합 가능
#include <iostream>
#include <string>
using namespace std;

int main(void){
	string str1 = "김치";
	string str2 = "볶음밥";
	string str3;

	str3 = str1 + str2;
	cout << str3 << endl;

	str1 += str2;
	cout << str1 << "~";
}

문자열 입출력

  • string 객체를 이용한 문자열의 경우에는
    입력 : cin 객체, 출력 : cout 객체 사용

❗ 하지만 cin 객체를 이용한 문자열 입력은 한 단어 단위로 수행됨
-> 문자열을 한 행(line)씩 읽고 싶을 때는 getline() 함수 사용

  • getline() 함수 )
    첫 번째 매개변수 -> cin 객체,
    두 번째 매개변수 -> 문자열 저장할 string 객체 변수 전달받음
    +공백 포함 문자열 입력가능
string kfood, jfood;

cout << "한식 1개 쓰기 : ";
getline(cin, kfood);
cout << "일식 1개 쓰기 : ";
getline(cin, jfood);

cout << "한식 예시 : " << kfood << "일식 예시 : " <<jfood;
[결과]
한식 1개 쓰기 : 김 치 볶음 밥
일식 1개 쓰기 : 오 코노 미야 키
한식 예시 : 김 치 볶음 밥, 일식 예시 : 오 코노 미야 키

[참고]
http://www.tcpschool.com/cpp/cpp_string_cStyle

0개의 댓글