7) 문자열
C++에서는 문자열을 두 가지 방법으로 생성할 수 있습니다.
하나는 C언어 스타일 (리터럴한 방식)이고, 나머지는 string 클래스를 이용한 방식입니다.
7-1. C언어 스타일의 문자열 생성
- char형 배열을 이용하여 생성
- 반드시 끝을 알려줘야함. (쓰레기값과 문자열을 구분하기 위함)
- Null 문자
- but, 배열이므로 생성될 문자열의 길이를 제한해야 한다는 것!
7-2. 문자열 생성 예제(C언어 스타일)
추가 참고 링크 : https://modoocode.com/191, https://modoocode.com/193, Quora
const int SIZE = 20;
char str_arr[SIZE];
int main() {
//std::cin >> str_arr;
std::cin.get(str_arr, SIZE).ignore(SIZE, '\n');
std::cout << str_arr;
return 0;
}
문자열을 일일이 {'a','b','c',...}
이런식으로 넣을수는 없으니.. std를 이용해서 직접 입력하는 경우가 많습니다.
-
std::cin
: 표준 입력 스트림- white space (
"", \t, \n
) 간격으로 입력을 구분함(delimeter).
- white space (
-
istream.get(*char s, streamsize n, char delim)
-
주어진 streamsize-1 개 까지 전부 받아들임
-
std::cin
에서 취급하는 delimeter 대신에 delim을 자체적으로 지정할 수 있음(기본값 =
\n
) -
그러나, 문제점은 delim은 stream에 그대로 남아있다는 것.
=> 만약 20개만 받아야하는데 25개를 줬다면, 5개는 그대로 스트림에 남아있기 때문에 다음 입력에 자동으로 들어가게 됩니다.
-
-
istream.ignore(streamsize n, char delim)
- n번째 이후에 스트림에 남아있는 입력값들을 지워줌.
ignore를 사용할지 말지는 상황마다 다르기 때문에 알아서 판단하는게 중요합니다.
7-3. 만약 string 클래스를 이용하면?
get, ignore 복잡하게 생각할 필요 없이 getline함수 하나로 편하게 받을 수 있습니다.
#include <string>
int main() {
std::string name, address;
std::getline(std::cin, name);
std::getline(std::cin, address);
std::cout << name << std::endl;
std::cout << address << std::endl;
return 0;
}
7-4. string 클래스
#include <string>
int main(){
std::string str1;
str1 = "C++ programming";
}
char형 배열을 쓸 필요 없이, 그냥 파이썬처럼 리터럴하게 문자열을 가져올 수 있습니다.
str.length()
: 길이를 확인하는 메서드- 인덱싱 가능
=
나+
메서드를 이용하여 문자열 대입, 결합 가능std::getline()
메서드를 이용하여 문자열을 행단위로 읽을 수 있음.
흡사 파이썬이랑 비슷해서 편한지 모르겠지만.. C문법보다는 훨씬 편리하다고 합니다.
7-5. string 클래스의 메서드들
-
append(추가할 문자열, 시작위치, 개수)
: 맨 끝에 문자열 추가하는 메서드. -
find(찾을 문자열, 시작위치)
-
str1.compare(str2)
: 사전식 순서(lexiographical order)대로 str1이 앞에 있는지 판단하는 메서드 -
str.replace(시작위치, 문자열 길이, 새로운 문자열)
- str의 시작위치부터 문자열 길이만큼 제거
- 시작위치에 새로운 문자열 삽입
파이썬의 replace 메서드와는 용법이 약간 다른 느낌입니다. 파이썬에서는 해당하는 패턴을 전부 바꿔주는 느낌이었는데요.. 자바스크립트의 splice와 비슷해보입니다.