프로그래밍 언어/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