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 |