개요
오늘은 문자열에 대해서 배웠습니다.
string 클래스와 각종 메서드에 대해서 배웠는데 반복자인지 뭔지는 이해가 조금 어렵지만
코드를 보면 대충은 읽을 수 있게 됐죠.
C#보단 C++이 이런부분에선 확실히 편한것 같습니다.
null 종료 문자열
#include <iostream>
using namespace std;
int main()
{
char c[] {'h','e','l','l','o'};
cout << c;
}
hello 라는 값이 담긴 char 배열을 출력해보면
이런 이상한 한자들이 같이 출력되는걸 볼 수 있는데 이건 C++이 문자열의 끝을 인식하지 못해서 이상한 값까지 읽어들이기 때문입니다.
그렇기 때문에
char c[] {'h','e','l','l','o', '\0'};
'\0' 문자로 null을 명시적으로 표시해줄 수 도 있지만 번거롭죠?
그래서
char c[] = "hello";
큰 따옴표로 묶어서 넣어주면 알아서 문자열 끝에 null이 들어갑니다.
C#은 일일히 .ToCharArray(); 같은 메서드를 쓰면서 넣어줘야 하는데 C++은 그딴거 없네요
문자열 끝에 null이 들어간단 사실은
char c[] = "hello";
cout << sizeof(c); // 출력결과 6
5글자인 char 배열의 byte가 6인것을 보면 알 수 있습니다.
string 클래스
C++ 은 여타 다른 언어들처럼 문자열을 하나로 묶어 저장하기 위해 우리들이 다 아는 string 클래스를 제공합니다.
문자열끼리 더하거나
string s1 = "아";
string s2 = " 집가고싶다.";
cout << s1 + s2; // 출력 결과 : 아 집가고싶다.
대소비교가 가능합니다.
string s1 = "가";
string s2 = "나";
s1 < s2 ? cout << s1 << " 이(가) 사전순으로 앞입니다."
: cout << s2 << "이(가) 사전순으로 앞입니다.";
// 출력 결과 : 가 이(가) 사전순으로 앞입니다.
string 라이브러리
사실 string은 클래스가 아니라 라이브러리가 본체입니다.
변수 하나에 한줄에 들어온 입력을 띄어쓰기 상관없이 받아올 수 있는 getline() 같은게 예죠.
string s;
getline(cin, s);
네? getline 그거 iostream에도 있다구요?
char c[100]
cin.getline(c, 100);
하지만 불편하게 크기까지 정해가면서 문자열을 담지 않아도 됩니다.
더 편하시잖아. 한잔해.
근데 getline은 cin과 충돌이 일어납니다.
int n;
cin >> n;
string s;
getline(cin, s); // 무시됨
int m;
cin >> m;
cout << n << endl;
cout << s << endl;
cout << m << endl;
입력 :
2
3
출력 :
2
3
어? 분명히 입력을 3개 받았는데 내가 입력을 3개 치기전에 출력을 해버립니다.
왜냐하면 cin으로 입력을 받으면 버퍼에 '\n' 이 남기 때문인데
다음 입력도 cin으로 받으면 전 버퍼에 있던 공백이나 개행을 무시해서 상관없지만
getline으로 받을경우 전 버퍼에 있던 공백과 개행을 전부 포함해서 받습니다.
그렇기 때문에 내가 치지 않은 엔터가 쳐져서 s 에 그냥 비어있는 값이 할당된겁니다.
이걸 해결하려면 getline()을 실행하기 전 cin.ignore() 라는 함수를 실행해서 버퍼를 비워줘야 합니다.
int n;
cin >> n;
cin.ignore();
string s;
getline(cin, s);
int m;
cin >> m;
cout << n << endl;
cout << s << endl;
cout << m << endl;
입력 :
2
asdf
3
출력 :
2
asdf
3
아주 잘되죠?
멤버 변수들
이거저거 많은데 하나하나 설명하긴 좀 힘드니까 넘어가겠습니다.
마치는 말
C++이 참 자유도가 높은 언어 같아요.
파면 팔수록 어? 이게 돼? 싶은게 많아요.
알고리즘 문제도 풀어보면서 C++에 재미를 좀 붙이고 있는데 파면 팔수록
기괴하고 이상하고 불안정하고 빠르고 불친절하지만 매력적인 언어 같습니다.
'개발 > C++' 카테고리의 다른 글
자료구조 | C++ | 클래스 (1) | 2024.04.05 |
---|---|
자료구조/게임 프로그래밍 | C++ | 함수, 포인터 (1) | 2024.03.28 |
게임 프로그래밍 | C++ | 랜덤 (2) | 2024.03.22 |
자료구조 | C++ | 기본 개념 (1) | 2024.03.07 |
자료구조 | C++ | 기초사항 (3) | 2024.03.06 |