본문 바로가기

CS/Python & C++

C++의 문자열 std::string

std::string이 필요한 이유

char line[256];
cin.getline(line, 256);

(참고로 const int LINE_LENGTH = 256; 과 같이 하는게 좋음)

위와 같은 코드는 아래 2가지 경우에 대해서 작동하지 않는다.

ㄱ. 아무것도 읽지 못했을 때

ㄴ. 한 줄에 문자가 256자 이상일 때 (즉 버퍼가 충분히 크지 않을때)

std::string 클래스

- std::string 클래스를 이요한 문자열은 길이가 증가할 수 있음.

문자열 대입(Assignment)과 덧붙이기(Appending)

C 스타일
char firstName[20] = "SeongMin";
char fullNmae[20];

// 대입 - 안전하지 않음
strcpy(fullName, firstName);
// 덧붙이기 - 안전하지 않음 (붙이는 문자열이 길경우...)
strcat(fullName, " Kim");

C++ 스타일
string firstName = "SeongMin";
string fullName = "Yang Min";

//대입
fullName = firstName;
//덧붙이기
fullName += " Yang";

문자열 합치기(Concatenation)

C 스타일 
char firstName[20] =  "SeongMin";
char LastName[20] = "Yang; 
char fullNmae[40];

snprintf(fullName, 40, "%s %s", firstName, LastName);

C++ 스타일 
string firstName = "SeongMin";
string LastName = "Yang";
string fullName;

fullName = firstName + " " + LastName;

비교(Relational) 연산자

C 스타일
if (strcmp(firstName1, firstName2) == 0)
{
}

if (strcmp(firstName1, firstName2) > 0)
{
}


C++ 스타일
if (firstName1 == firstName2)
{
}

// 사전 상의 순서를 비교
if (firstName1 > firstName2)
{
}

size(), length(), c_str()

문자열의 길이를 반환
const char*
해당 string이 가지고 있는 문자 배열의 시작 주소를 가리키는 포인터를 반환.

string firstName = "YANG";
char letter = firstName[1];
firstName[3] = "K";

firstName[3]과 같은 방식은 함수의 리턴값이라 임시값이다. 그렇지만 위의 코드처럼 작동하는 이유는 참조자를 반환해서 대입연산이 되기 때문이다.

위와 같은 배열 인덱싱 대신에 .at()을 사용할 수 있지만 잘 사용하지는 않는다.

한 줄 읽기

string mainHeader
getline(cin, mainHeader);         // '\n' 문자를 만날때 까지 cin에서 문자를 꺼내서 mainHeader에 저장.
getline(cin, mainHeader, '#');  // '#' 문자를 만날때 까지 cin에서 문자를 꺼내서 mainHeader에 저장.

다음의 조건을 만족할 때 까지 계속해서 스트림에서 문자들을 꺼내 string에 저장.
-end of file을 만날 때(eofbit 값이 true가 될 때)
-구분 문자(delimiter)를 만날 때까지(구분 문자는 버려짐)

std::string이 좋은가?

-힙 메모리 할당은 비교적 느림
-메모리 단편화(memory fregmentation) 문제
-내부 버퍼의 증가는 멀티 쓰레드 환경에서 안전하지 않을 수도
-여전히 spritnf와 함께 char[]를 많이 사용함.

'CS > Python & C++' 카테고리의 다른 글

파일 다루기  (0) 2025.01.17
람다 식(Lambda Expression)과 STL 알고리즘  (0) 2024.03.04
이동 생성자 & 이동 대입 연산자  (0) 2024.01.29
스마트 포인터  (0) 2023.12.14
Circular Dependency (순환 종속성)  (0) 2023.06.28