IT 프로그래밍/C++

C-string과 string의 차이

기술1 2024. 3. 18. 20:19
반응형

C-string


c-string을 사용하려면 <cstring> 헤더를 include합니다. c언어는 문자열을 하나의 독립적인 데이터타입으로 보기보다는 문자들의 sequence로 보는 구조입니다. 여러개의 문자를 한꺼번에 저장하는 것입니다. string이라는 것을 독립적인 배열보다는 문자 배열이라고 보는 것입니다. 

 

null 문자('\0') 로 끝나는 char 타입 배열 . 

char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};

배열은 충분히 잡고 앞에 저장하는 방식으로 사용을 하지만 그럴 때 문제점이 뒤에 있는 것에 빈 쓰레기값이 써져 있을테니 이 배열에 저장되어 있는 문자열들을 다룰 때 어디까지가 저장되어 있는 문자열인지 판단할 수 없습니다.

 

그래서 배열을 다룰 때 크기는 max로 잡지만 정수들을 저장할 때는 의미있는 개수를 기억하고 있어야합니다. 그런데 그걸 기억하는 것은 굉장히 번거로운 일이기 때문에 실제의 끝에 '\0' (=NULL) 문자를 집어넣습니다. 

 

 string은 문자열의 복사, 비교, 수정 등 다양한 문자열을 제공합니다.

 

String class(C++)


#include <iostream>
#include <string>

using namespace std;
int main()
{
	string str;
	string str1 = "John Doe";
	string str2("Nam gu, Ulsan, Korea");
	string name = str1;
	string address(str2);
	cout << str << " " << str1 << " " << str2 << " "
		<< name << " " << address << endl;

	string str3 = { "Hello World" };
	string str4{ "Hello World" };
	string str5{ str3 };
	cout << str3 << " " << str4 << " " << str5 << endl;
	return 0;
}

string은 이렇게 다양한 식으로 정의가 가능합니다. " " 를 해서 써줄 수도 있고 괄호를 넣어줄 수도 있고 다른 string의 변수를 가져올 수도 있습니다. 소괄호로 할 수 있는 것은 {} 로도 가능합니다. 

 

밑에 보시면 str3, str4, str5 도 정상적으로 string을 가질 수 있습니다. 

 

#include <iostream>
#include <string>

using namespace std;
int main()
{
	string text;

	while (true) {

		getline(cin, text);
		
		if (text == "exit")
			break;
		
		cout << text << ":" << text.length() << endl;
	}
	return 0;
}

string을 입력해주긴 위해선 getline이 필요합니다. getline은 말 그대로 한 라인을 출력해주는 것인데요. 지정한 문자가 나올 때까지 읽어주는 것입니다. 

 

getline은 라인 전체를 한 번에 읽어서 두 번째 매개변수인 text에 저장해줍니다. 줄바꿈 문자 자체는 저장하지 않습니다. 

 

 

getline(cin, text); 이것은 한 라인을 읽는 getline입니다. 하지만 특정한 문자가 나올 때까지 읽고 싶을 때는 하나를 더 추가해주면 되는데요.

 

getline(cin, text, '\t'); 이렇게 해주면 '\t'문자를 칠 때까지 거기를 라인의 끝으로 인식하고 그것 앞까지 읽어서 라인을 저장하는 것입니다. 

 

이 getline이 꼭 line을 읽는 것에 한정되지 않고 특정한 문자를 지정해서 구분자로 이용해서 입력 텍스트에서 지정한 문자가 나오기 전까지를 다 읽어서 그 전체를 하나의 문자로 읽어주고 반복해서 읽는 것이 가능하다는 점 아시면 됩니다. 

반응형