1. String 타입
- string은 문자열의 모음이라고 할수 있다.
#include <string>
using std::string;
- 가변길이 문자열이며, 해당 string타입을 사용하려면
이렇게 string 헤더를 사용하여야 한다.(참고로 string은 std::string에 정의 되어 있다.)
string s1; // string의 기본 초기화. s1은 빈문자열이다.
string s2 = s1; //s2는 s1의 복사본이다.
string s3 = "hiya"; //s3는 문자열의 복사본이다.
string s4(10,'c'); //s4는 cccccccccc(c가 10개)라는 뜻.
위에 코드 마다 주석에 달린 내용으로 사용법을 대략 알수 있겠지만,
보다시피 초기화를 하는 방법이 두 가지이다.
1-1. string의 직접초기화 & 복사초기화.
string s5 = "hiya" //복사 초기화
string s6("hiya"); //직접 초기화
string s7(10, 'c'); //직접초기화, s7은 cccccccccc(c가 10개)라는 뜻.
초기값이 하나일 때는 직접초기화이든, 복사초기화든 상관이 없다.
하지만 s7처럼 초기값이 여러개라면 반드시 직접 초기화를 해야한다.
string 객체이름(초기화 개수, '문자');
이런 초기화 방법은 맨뒤에 있는 문자를 초기화 개수에 맞게 생성하여
위에 s7과 s4처럼 c를 10개를 변수에 저장하는 것으로 초기화한다.
- 또한 초기값이 여럿일때 복사할 (임시)객체를 명시적으로 만들어
복사 초기화 형식을 간접적으로도 사용이 가능하다.
string s8 = string(10,'c'); //복사 초기화 s8은 cccccccccc(c가 10개)라는 뜻.
1-2. string의 연산
- 이름으로 호출가능한 연산, <<, + 처럼 해당 클래스
타입 객체에게 적용될 때 의미있는 연산기호들을 사용가능하다.
stirng s;
cin >> s;
cout << s <<endl;
빈 string s를 정의한 이후 표준입력에서 사용자가 문자열을 입력하면
s에 그 문자열을 저장하고서 출력하겠다는 코드이다.
string s1, s2;
cin >> s1, s2; //첫입력은 s1에, 두번째 입력은 s2에 저장.
cout << s1 << s2 << endl; //string 2개를 출력.
이렇게 입력을 두개를 받아야 하는 상황에서 순차적으로
사용자가 Enter버튼을 누르기 전까지 앞에 있는 s1부터 그다음 s2에
사용자가 입력한 문자열이 저장된다.
1-3. 임의 개수 string 읽기
int main()
{
string word;
while (cin >> word) //파일 끝에 도달할때까지 읽음.
cout << word << endl; //한주렝 한단어씩 출력함.
return 0;
}
- 파일 끝에 도달하지 않았거나, 유효하지 않는 입력을 받지 않는등
스티림이 유효하면 while 본체를 실행한다.
즉, while 본체에서는 읽은 값을 표준 출력으로 보낸다.
파일 끝에 도달하거나 유효하지 않는 입력을 만나면 while을 벗어난다.
1-4. getline 함수
-입력 내용에서 공백문자를 무시하고 싶지 않을때 사용함.
즉, 한줄 전체 읽기가 가능.
때문에 cin으로 공백문자를 받고 싶을때 >>대신 getline을 이용하면 됨.
- getline 함수는 입력스트림과 string을 인자로 받는다.
-지정된 스트림에서 줄바꿈 문자를 만날때까지 줄바꿈 문자를 포함해서
입력 내용을 읽고서 그 줄바꿈 문자를 제외한 내용을 인자로
지정한 string에 저장한다.
대충 이런 방식이다.
- 그러므로 첫 문자가 줄바꿈이라면 그 결과는 비어있는 string이다.
다른 입력 연산자처럼 getline에서도 istream인자를 반환한다.
-> 때문에 위에 코드들 처럼 getline도 조건문에서 사용가능.
(while, for, if등등...)
string line;
while (getline (cin,line))
cout << line << endl; //파일 끝에 도달할 때까지 입력에서 한번에 한줄씩 읽는다.
return 0;
위 코드에서 string line에는 줄바굼 문자가 없으므로
직접 추가해야한다. <- 주로 endl을 사용한다.
(이후 현재줄을 마치고 버퍼를 비운다.)
1-5. string empty와 size연산
- empty 함수 : string이 비어있는지 나타내는 bool을 반환.
- empty는 string의 멤버함수 이므로,
함수 호출시에 점(.)연산자를 사용해 호출함.
-> 이제 내용이 있는 줄만 출력하도록 의도하는 것이 가능하다.
while (getline (cin, line))
if(!line.empty()) //참고로 !는 Not연사자이다.(피연산자를 평가한 bool의 값을 역변환 함)
- size 멤버 : string의 길이, 즉 문자수를 반환한다.
string line;
while (getline(cin, line))
if(line.size() > 80)
cout << line << endl;
1-6. string::size_type타입
- size에서는 int나 unsigned를 반환할 것 같지만...
사실 size는 string::size_type을 반환한다.
-> 이유는 string 클래스를 비롯해서 다른 라이브러리에서 대부분
여러 동반 타입을 정의하기 때문에 그렇다.
즉, 시스템에 독립적인 방법으로 라이브러리 타입을 쓰기 위함이다.
size_type을 이용하려면 범위지정연산자(::)를 사용해서
size_type이 클래스에서(string 클래스에서) 정의한 이름임을 알려야 한다.
- 대충 size_type이 대체 어떤 타입인지는 몰라도
어떤 string 크기라도 담을만한 충분한 크기의 타입일 것이다.
또한 string size 연산 결과를 저장하는데 사용할 변수들은
모두 string::size_type이여야 한다.
->근데 이거도 사실 c++14에서는 auto나 decltype으로
적절히 간편하게 사용하도록 바뀌었다.
auto len = line.size(); //len은 string::size_type이다.
size에서는 부호없는 타입을 반환하므로
표현식에 부호가 있는 데이터와 부호가 없는 것을 섞어쓰면
이상한 결과가 나온다.
마치 unsigned int 객체에서 -1을 대입하여 출력하면 65535가 나오는 것처럼...
1-7. string 비교하기
- stirng은 대소문자를 서로 구별한다.
-> 때문에 어떤 문자의 대문자와 소문자는 서로 다른 취급을 받는다.
상등연산자(==),(!=)도 각가 사용 가능하다.
관계연산자(<,<=,>,>=)도 크기(문자열 길이)를 비교할 수 있다.
또 관계연산자를 사용할 시 대소문자를 구분하는 마치 국어사전과
같은 방법도 사용가능하다.
비교할때 규칙 특징들을 한번 살펴보자면,
- 규칙 1 : 두 string의 길이가 다르고 짧은 string의 모든 문자가
긴것의 같은 위치에 있는 문자와 같다면 당연히 짧은게 긴것보다 길다. - 규칙 2 : 두 string에서 대응하는 위치의 어떤 문자가 서로 다를때
비교결과는 string이 다른 첫번째 문자비교 결과에 따른다.
string str = "Hello";
string phase = "Hello World";
string slang = "Hiya";
위에 코드를 봤을때 규칙 1에 따라서 str이 phase보다 작고,
규칙 2에 따라 slang이 str과 phase보다 크다.
즉, H까지는 string 3개 모두 같지만 이후 알파벳에서 e와 i중 더 뒤에 배치되어있는 것이
i이기 때문에 규칙 2에 의거하여 slang이 다른 str과 phase보다 높은 것으로 추측된다.
(솔직히 나도 이렇게 생각하는거 제외하곤 잘 이해가 되지는 않는다.)
1-8. string 대입
- string의 경우에도 한 string을 다른 것에 대입할 수 있다.
string st1(10,'c'), st2; // st1은 c(10개), st2는 비어있는 string.
st1 = st2 // 대입 : st1내용을 st2 복사본으로 바꾼다.
// 이제 st1과 st2모두 빈 string이다.
- 또한 대입 뿐만아니라 두 string을 더하는 것도 가능하다.
string을 더하면 왼쪽 피연산자 뒤에 오른쪽 피연산자를 결합한
새로운 string을 반환한다.
string s1("아이쒸");
string s2("에라이");
string s3 = s1 + s2 //s3의 값은 "아이쒸 에라이"이다.
- 참고로 s1+=s2도 동일한 결과값을 보여준다.
이후 글에서는 상수와 string 덧셈, string 내의 문자다루기등등을 한번 적어보겠다.
'Game DevTip > C++' 카테고리의 다른 글
5. C++ auto & decltype에 대해서. (0) | 2024.12.05 |
---|---|
4. C++ Typedef(타입 별칭)에 대해서 (0) | 2024.12.05 |
3. C++ constexpr에 대해서 (1) | 2024.12.05 |
2. C++ const에 대하여 (0) | 2024.12.05 |
1. C++ 변수사용 Tip에 대해서. (0) | 2024.12.05 |
댓글