티스토리 뷰

언어/C++

[C++] 문자열 / std::string

js0331 2020. 3. 28. 13:38

문자열 / std::string

헤더 파일 선언

#include<string>

 

 

일반 변수와 같이 초기화가 가능하다.

std::string myStr;
myStr = "Hi";

std::string myStr("21");
std::string myStr("Hello World!");

 

 

문자열 입출력

#include<iostream>
#include<string>

int main()
{
	std::string name;
	std::cin >> name;
    
    std::string age;
    std::cin >> age;
    
    cout << "name is" << name << "\n" << "age is" << age << endl;
}

 

결과물

John Lion
25

name is John
age is Lion

이렇게 나오게는 되는 이유는 std::cin의 경우 입력을 받을 때, 첫 번째 공백 전 까지의 입력만을 처리하게 되어 다음 추출은 cin 내부의 남게 되버린다.

 

따라서 위 결과물이 John Lion / 25이 아닌 John / Lion으로 출력되는 이유이다. 이러한 문제를 해결하기 위해서는 std::getline()함수를 사용하면 된다.

 

std::getline()

std::getline(std::cin, std::string variable)로 이루어진다. 위의 코드의 std::cin을 std::getline()으로 바꾸면 오류가 해결되지만, 만일 cin과 getLine을 같이 사용하게 될 경우 또 다른 오류가 발생할 수 있다.

 

cin을 사용하면 숫자 값을 입력하면 cin은 숫자 값만 캡처할 뿐만 아니라 "\n"도 캡처한다. 그렇게 되면 cin은 실제로 "2\n" 문자열을 얻는다. 그런 다음 숫자 값 2를 추출해서 choice 변수에 할당한다. 그러면 getline() 함수가 이름을 읽으러 갈 때 스트림에 "\n"이 남아 있는 걸 보고 빈 문자열을 입력받았다고 생각하여 name 변수에 빈 문자열을 할당한다.

 

 

std::cin으로 숫자 값을 읽은 후 스트림에서 "\n"을 제거하는 것이 좋다.

std::cin.ignore(32767, '\n');  // ignore up to 32767 characters until a \n is removed

32767은 cin::ignore() 함수가 무시할 문자 수다. 이 숫자는 모든 플랫폼에서 2-byte 정수의 가장 큰 값이다.

 

 

기술적으로 무시하는 방법은

#include<limits>

//...

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

이지만 헤더파일도 추가해야하므로 실용적인 32767을 사용하는 것이 좋다.

 

 

이런식의 연산도 가능하다.

std::string a("452");
std::string b("23");

a += b;

cout << a << endl;

// 45223

 

 

string의 길이를 파악하는 방법은으로는 length()함수를 이용하는 방법이 있다.

std::string myStr("abcd");

cout << myStr.length() << endl;

// 4

length()함수는 <string>의 포함되어 있는 멤버 함수이다.

 

 

.

.

.

 

 

string 함수 정리 블로그 주소

https://blockdmask.tistory.com/338

'언어 > C++' 카테고리의 다른 글

8.5 위임 생성자  (0) 2020.04.22
8.4 생성자 멤버 초기화 목록  (0) 2020.04.22
8.3 생성자 Constructors  (0) 2020.04.22
8.2 캡슐화, 접근 지정자, 접근 함수  (0) 2020.04.22
[C++] std::array  (0) 2020.03.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함