프로그래밍 언어/C++

C++ 문자열 총정리

순정법사 2023.09.09

A. C++ 문자열 개요

1. C++ 문자열

a. C++ 문자열이란?

🌟 메모리에 저장된 일련의 연속된 문자(character)들의 집합

 

💙 c++에서는 2가지 스타일로 생성 가능

 

1. c언어 스타일의 문자열

2. string 클래스를 이용한 문자열

 

 

2. C언어 스타일의 문자열

a. C 스타일의 문자열 선언

문자열 상수(string constant) : 큰따옴표("")를 사용해 표현되는 문자열

👉 상수인 이유는 이름 X, 내용 변경 X

 

⏳ 예제

const int SIZE = 20;
char address[SIZE] = "hello";	//보이지 않지만 끝에 0 이 있음

 

b. C스타일의 문자열 특징

  • 문자형 배열을 선언하면 이 배열이 곧 문자열 변수가 됨
  • C언어 스타일의 문자열 입력에서는 입력할 문자열의 길이를 미리 알고 있어야만 함
  • C++에서는 문자열의 길이에 제한 X

 

c. NULL 문자

🌟 문자열이 끝나면 끝을 의미하는 문자( 널(NULL) 문자, '\0'으로 표시)를 하나 더 삽입

 

null 문자는 아스키코드 값도 0

널 문자의 유무로 문자형 데이터 배열과 실제 문자열을 서로 구분

 

d. C스타일의 문자열 입출력

1) 문자열을 입력받기 위해서는 문자열이 저장될 문자형 배열을 미리 생성해야 함

 

2) cin 객체는 띄어쓰기, 탭 문자, 캐리지 리턴 문자를 모두 문자열의 끝으로 인식

👉 cin 객체의 get() 메소드를 이용해 문자열의 끝을 잘 인식할 수 있게 함

 

3) 길이는 cin 객체의 ignore() 메소드를 사용

 

 

⏳ 예제 : 띄어쓰기와 문자열 길이를 처리

const int SIZE = 20;
char address[SIZE];	//1) 
char name[SIZE];
 
cout << "자신의 이름을 적어주세요 : ";
cin.get(name, SIZE).ignore(SIZE, '\n');	//2), 3) 

cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin.get(address, SIZE).ignore(SIZE, '\n');	//2), 3) 

cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";

✨ 실행결과

자신의 이름을 적어주세요 : abcdefghijklmnopqrstuvwxyz
자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ

ABCDEFGHIJKLMNOPQRS에 살고 있는 abcdefghijklmnopqrs님~ 감사합니다!

 

e. string 클래스를 이용한 문자열 입출력

C++에서는 string 클래스를 이용해 위 코드를 단순하게 사용 가능

문자열의 띄어쓰기 문제나 문자열의 길이와 상관없이 모든 문자열을 정확히 입력받을 수 있음

 

⏳ 예제 : C++ 스타일의 string을 활용

#include <iostream>
#include <string>
using namespace std;
 
int main(void)
{
    string address, name; 

    cout << "자신의 이름을 적어주세요 : ";
    getline(cin, name);

    cout << "자신이 살고 있는 도시를 적어주세요 : ";
    getline(cin, address);

    cout << address << "에 살고 있는 " << name << "님~ 감사합니다!";
    return 0;
}

✨ 실행결과

자신의 이름을 적어주세요 : 가나다라마바사아자차카타파하
자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ

ABCDEFGHIJKLMNOPQRSTUVWXYZ에 살고 있는 가나다라마바사아자차카타파하님~ 감사합니다!

 

f. C언어 문자열 처리 함수

C++에서는 C스타일 문자열을 처리하기 위해 C라이브러리 문자열 처리 함수를 이용

 

👇 사용할 수 있는 함수는 아래에서 확인

 

 

[문자와 문자열] 입출력 함수 총정리 2 : 문자열

C. 문자열 1. 문자열(string) a. 문자열 상수(string constant) 큰따옴표("")를 사용해 표현되는 문자열을 문자열 상수(string constant)라고 함 이름이 없고, 내용을 변경할 수 없어서 상수라고 표현함 b. 문자

monamu.tistory.com

 

 

 


B. String 기초

1. string 클래스

a. string 클래스란?

🌟 문자열을 하나의 타입처럼 표현할 수 있게 해줌 (문자형 배열보다 사용하기 편리)

 

사용하기 전 string 헤더 파일을 포함해야 함

string 클래스는 std 네임스페이스에 포함되어 using 지시자나 해당 네임스페이스를 참조해야 함

 

b. 선언 및 초기화

📘 string 객체를 사용한 문자열 선언

string str1;              // 문자열의 선언
str1 = "C++ Programming"; // 문자열의 초기화
string str2 = "C++";      // 문자열의 선언과 동시에 초기화

 

c. string 객체의 특징

  • 배열의 형태가 아닌 단순한 변수로 선언
  • 길이 명시 X, 길이에 대한 문제는 C++ 프로그램이 자동으로 처리
  • 선언시 길이는 0, 초기화하면 자동으로 조절 = 편하고 안전하게 문자열 처리 가능
  • 인덱스로 다룰 수 있음

 

⏳ 예제 : 길이를 자동 조절

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string dog;
	cout << "현재 dog 변수의 길이는 " << dog.length() << "입니다." << endl;

	dog = "Navi";
	cout << dog << "! 정말 이쁜 이름이네요!" << endl;
	
	cout << "현재 dog 변수의 길이는 " << dog.length() << "입니다." << endl;
	cout << "강아지 이름의 첫 글자는 바로 " << dog[0] << "입니다.";
	return 0;
}

✨ 실행결과

현재 dog 변수의 길이는 0입니다.
Navi! 정말 이쁜 이름이네요!

현재 dog 변수의 길이는 4입니다.
강아지 이름의 첫 글자는 바로 N입니다.

 

💥 만일 강아지 이름이 한글이라면 한글은 2byte로 취급되기 때문에 제대로 출력되지 않음

 

c. 문자열 처리

1) 대입

 

strcpy()나 strncpy() 사용할 필요 없이 = 사용

 

2) 추가 / 결합

 

strcat() / strncat() 사용할 필요 없이 =+ / append() 메소드 사용

 

⏳ 예제 : 복사, 결합

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string str0 = "Hello";
	string str1;
	string str2 = "World";
	string str3;
	
    str1 = str0 ;	//문자열 대입 연산
	str3 = str1 + str2;		// 문자열 결합 연산	
	str1 += str2;			// 문자열 추가 연산 

	cout << str3 << endl;
	cout << str1;
	return 0;
}

✨ 실행결과

HelloWorld
HelloWorld

 

d. 문자열 입출력

입력에는 cin 객체를, 출력에는 cout 객체를 사용

한 단어 단위로 수행하기 때문에 한 행씩 읽고 싶으면 getline()함수 사용

 

📘 문법

getline(cin 객체, 저장할 string 변수);

 

⏳ 예제 : getline() 함수

string name, subject;

cout << "자신의 이름을 적어주세요 : ";
getline(cin, name);

cout << "가장 자신있는 과목을 적어주세요 : ";
getline(cin, subject);

cout << name << "님이 가장 자신있어 하는 과목은 바로 " << subject << "입니다!";

✨ 실행결과

자신의 이름을 적어주세요 : 홍길동
가장 자신있는 과목을 적어주세요 : 국어

홍길동님이 가장 자신있어 하는 과목은 바로 국어입니다!

 

 

2. string 메소드

a. string 메소드

🌟 string 클래스에 정의된 문자열과 관련된 작업을 할 때 사용하는 메소드

 

아래는 대표적인 문자열 처리 함수를 정리

 

b. length() 메소드와 size() 메소드

🌟 문자열의 길이를 반환하는 메소드

 

둘이 같은 값을 반환하지만, length()는 문자열의 길이 / size()는 메모리의 실제 사용 크기를 의미함

 

⏳ 예제 : length() 메소드와 size() 메소드

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string str1;
	string str2 = "C++ Programming";
	
	cout << "문자열 str1의 길이는 " << str1.length() << "입니다." << endl;	//0
	cout << "문자열 str2의 길이는 " << str2.size() << "입니다.";	//15
	return 0;
}

 

c. append() 메소드

🌟 하나의 문자열의 끝에 다른 문자열을 추가하는 메소드

 

📘 문법

1. 문자열.append(추가할문자열);                 // 추가할 문자열을 맨 끝에 추가함.
2. 문자열.append(추가할문자열, 시작위치, 개수); // 추가할 문자열의 시작 위치부터 개수만큼만 맨 끝에 추가함.
3. 문자열.append(개수, 추가할문자);             // 추가할 문자를 개수만큼 맨 끝에 추가함

 

⏳ 예제 : append() 메소드

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string str1, str2, str3;
	
	str1.append("C++ Programming");
	str2.append("C++ Programming", 4, 7);
	str3.append(4, 'X');
	
	cout << str1 << endl;	//C++ Programming
	cout << str2 << endl;	//Program
	cout << str3;	//XXXX
	return 0;
}

 

d. find() 메소드

🌟 특정 문자열을 찾아, 그 시작 위치를 반환하는 메소드

 

찾을 문자열을 찾지 못하면, string::size_type의 string::npos라는 상수를 반환

👉 정적 상수인 string::npos는 string 클래스에 static const size_type= -1 로 명시

 

📘 문법

1. 문자열.find(찾을문자열);           // 인덱스 0부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.
2. 문자열.find(찾을문자);             // 인덱스 0부터 찾을 문자를 찾아, 그 시작 위치를 반환함.
3. 문자열.find(찾을문자열, 시작위치); // 시작 위치부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.

 

⏳ 예제 : find() 메소드

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string str = "C++ Programming";
	
	cout << str.find("Pro") << endl;	//4
	cout << str.find('r') << endl;	//5
	
	if (str.find("Pro", 5) != string::npos)
	{
		cout << "해당 문자열을 찾았습니다.";
	}
	else
	{
		cout << "해당 문자열을 찾지 못했습니다.";	//출력
	}
	return 0;
}

 

e. conpare() 메소드

🌟 두 문자열 간의 내용을 비교하는 메소드

 

📘 compart() 메소드의 반환값이 참(true)이 되는 경우

1. str1.compare(str_02) == 0 // str1과 str2이 같을 경우
2. str1.compare(str_02) < 0  // str1이 str2보다 사전 편찬순으로 앞에 있을 경우
3. str1.compare(str_02) > 0  // str1이 str2보다 사전 편찬순으로 뒤에 있을 경우

 

⏳ 예제 : compare() 메소드

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string str1 = "ABC";
	string str2 = "ABD";
	
	if (str1.compare(str2) == 0)
	{
		cout << str1 << "가(이) " << str2 << "와 같습니다.";
	}
	else if (str1.compare(str2) < 0)
	{
		cout << str1 << "가(이) " << str2 << "보다 사전 편찬 순으로 앞에 있습니다."; //출력
	}
	else
	{
		cout << str1 << "가(이) " << str2 << "보다 사전 편찬 순으로 뒤에 있습니다.";
	}
	return 0;
}

 

f. replace() 메소드

🌟 특정 문자열을 찾아, 그 문자열을 다른 문자열로 대체

 

📘 문법

문자열.replace(대체할문자열의시작위치, 대체할문자열의길이, 새로운문자열);

// 전달된 시작 위치부터 문자열의 길이만큼을 제거한 후에, 새로운 문자열을 삽입

 

사용하기 전에 우선 find() 메소드를 사용하여 해당 문자열이 존재하는지를 파악해야 함

 

⏳ 예제 : replace() 메소드

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string str1 = "C++ is very nice!";
	string str2 = "nice";
	string str3 = "awesome";
	
	string::size_type index = str1.find(str2);
	if (index != string::npos)
	{
		str1.replace(index, str2.length(), str3);
	}
		
	cout << str1;	//C++ is very awesome!
	return 0;
}

 

i. capacity() 메소드

🌟 해당 문자열이 재대입(reallocation)받지 않고 저장할 수 있는 최대 문자열의 길이를 반환

 

j. max_size 메소드

🌟 해당 문자열이 최대한 대입받으면 가질 수 있는 최대 문자열의 길이를 반환

 

⏳ 예제

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string str = "C++ programming";
	
	cout << "문자열 str의 length는 " << str.length() << "입니다." << endl;	//15
	cout << "문자열 str의 capacity는 " << str.capacity() << "입니다." << endl;	//15
	cout << "문자열 str의 max_size는 " << str.max_size() << "입니다.";	//4611686018427387903
	return 0;
}

 

 

 


출처 : http://www.tcpschool.com/cpp/cpp_string_cStyle

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com