본문 바로가기
OLD_알고리즘

C++ ] 문자열(string, char)

by 달승 2021. 1. 8.

문자열(string)이란

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

 

C++에서는 문자열을 두 가지 방법으로 생성할 수 있습니다.

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

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

 


C언어 스타일의 문자열

C++에서는 " "를 사용해 표현되는 문자열을 문자열 상수라고 합니다.

상수라고 표현하는 이유는 해당 문자열이 이름을 가지고 있지 않으며, 문자열의 내용 또한 변경할 수 없기 때문입니다.

C++에서 문자형 배열을 선언하면 곧 문자열 변수가 됩니다.

🥑 C++에서는 문자열의 길이에 제한을 두지 않습니다.

 

 

|   널(NULL) 문자

 

문자열의 끝을 의미하는 문자를 하나 더 삽입합니다.

'\0'로 표시하고, ASCII code로는 0입니다.

 

** 널 문자의 유무로 문자형 데이터 배열과 실제 문자열을 서로 구분할 수 있습니다.

🥑 문자열을 저장하기 위한 문자형 배열을 선언할 때에는 반드시 널 문자까지 포함해서 생각해야 합니다

 

 

|   문자열 입력

const int SIZE = 20;

char address[SIZE];
char name[SIZE];

// ********************
// cin : 띄어쓰기 미포함
// ********************
cout << "자신의 이름을 적어주세요 : ";
cin >> name;

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

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

이 예제는 다음과 같은 두 가지 문제점을 안고 있습니다.

 

1. 이름에 띄어쓰기가 들어가면 도시명을 입력할 수 없습니다.

2. 20바이트 이상의 이름이나 도시명을 입력하면 프로그램이 강제 종료됩니다

 

C++에서 cin 객체띄어쓰기를 포함한 탭 문자, 캐리지 리턴 문자 등을 모두 문자열의 끝으로 인식합니다.

따라서 띄어쓰기를 포함한 문자열을 전부 입력받으려면 cin 객체의 get() 메소드를 사용하여 다음처럼 수정해야 합니다.

 

const int SIZE = 20;

char address[SIZE];
char name[SIZE];

// ********************
// get() : 띄어쓰기 포함
// ********************
cout << "자신의 이름을 적어주세요 : ";
cin.get(name, SIZE).get();

// ********************
// ignore() : 한정된 바이트 이상으로 입력 받을 수 있음
// ********************
cout << "자신이 살고 있는 도시를 적어주세요 : ";
cin.get(address, SIZE).ignore(SIZE, '\n');

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

 

하지만

 C++에서 제공하는 string 클래스의 getline( )을 이용하면 간단합니다.

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

#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;
}

 

|   C언어 문자열 처리 함수 종류

 

#include <string.h>

 

 

 


string 클래스를 이용한 문자열

 

string 클래스는 문자형 배열보다 사용하기 편리하며, 문자열을 하나의 타입처럼 표현할 수 있게 해줍니다.

 

string str1;              // 길이가 0인 문자열의 선언

str1 = "C++ Programming"; // 문자열의 초기화

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

string 객체는 위와 같이 문자열을 배열 형태가 아닌 단순한 변수로 선언합니다.

문자열의 길이에 대한 문제는 C++ 프로그램이 자동으로 처리해 줍니다.

 

string dog = "Navi";

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

cout << "강아지 이름의 첫 글자는 바로 " << dog[0] << "입니다.";

string 객체로 만든 문자열도 인덱스로 다룰 수 있습니다.

 

|  문자열 처리

string str1 = "C++ is Cool!";
string str2;

str2 = str1; // 문자열 대입 연산

str2 출력 >> C++ is Cool!

string 객체를 이용하면 복합 대입 연산자(+=)나 append( ) 메소드를 이용하여 손쉽게 추가나 결합을 할 수 있습니다.

🥑 이때 append( )메소드는 '문'일 때는 불가능하고, "문자열"일 때만 가능합니다.
     '문'이나 '자' 등 한 글자를 추가/결합할 경우, 복합 대입 연산자(+=)를 사용해줍니다.

 

|  문자열 입출력

문자열을 한 행(line)씩 읽고 싶을 때는 getline() 함수를 사용

 

string 메소드

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

string 클래스에서 제공하는 대표적인 문자열 처리 함수는 다음과 같습니다.

 

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

length(  )  문자열의 길이
size(  )  해당 string 객체가 메모리에서 실제 사용하고 있는 크기

두 메소드는 같다고 보면 됩니다.

 

2. append(  ) 메소드

 

3. find(  ) 메소드

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

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

string str = "C++ Programming";

cout << str.find("Pro") << endl;
cout << str.find('r') << endl;

if (str.find("Pro", 5) != string::npos){
    cout << "해당 문자열을 찾았습니다.";
}else{
    cout << "해당 문자열을 찾지 못했습니다.";
}

 

🥑 정적 상수인 string::npos는 string 클래스에 static const size_type= -1 로 명시되어 있습니다.

 

4. compare(  ) 메소드

이 메소드는 true / false를 반환합니다.

아래 예시는 true를 반환하는 경우입니다.

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

 

5. replace(  ) 메소드

 

6. capacity(  ) 메소드와 max_size(  ) 메소드

 

7. at( index )

    해당 위치( index )에 해당하는 문자를 반환합니다. 

str1.at(0);    //"BlockDMask" -> 'B'를 리턴합니다.

 

8. insert( )

basic_string& insert(size_type index, size_type count, CharT ch);
basic_string& insert(size_type index, const CharT* s);
basic_string& insert(size_type index, const CharT* s, size_type count);
basic_string& insert(size_type index, const basic_string& str);
basic_string& insert(size_type index, const basic_string& str,
                     size_type index_str, size_type count = npos);

 

 

 


문자를 숫자로 변환하기

 

string -> char로 잘라서 출력하기

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

int main(){
	string S = "12345";
	char tempS;
	
	for(int i = 0; i < S.size(); i++){
		tempS = S.at(i);
    	cout << tempS << ' ';
	}
	return 0;
}

 

string -> char[ ] 배열에 잘라서 출력하기

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

int main(){
	string S = "12345";
	char tempS[30];
	
	for(int i = 0; i < S.size(); i++){
		tempS[i] = S.at(i);
		
    	cout << tempS[i] << ' ';
	}
	return 0;
}

 

 

 

★★★★★

 

< 문자 -> 숫자 >

string을 하나씩 char[ ]에 담은 뒤, - '0'을 해주기

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

int main(){
	string S = "12345";
	char tempS[30];
	int tempN;
	
	for(int i = 0; i < S.size(); i++){
		tempS[i] = S.at(i);
		
		tempN = tempS[i] - '0';
		cout << tempN;
	}
	return 0;
}

 

 

< 숫자 -> 문자 >

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

int main(){
	int S = 1;
	char tempS;
	
	for(int i = 0; i < 5; i++){
		tempS = S + '0';

	}
	cout << tempS;
	
	return 0;
}

 

 

 

 

 


reference

 

코딩교육 티씨피스쿨

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

tcpschool.com

 

[C++] string 클래스, 문자열에 대해서 (총정리)

안녕하세요 BlockDMask 입니다. 오늘은 C++의 std::string 클래스(문자열)에 대해서 세세 하게 알아볼것 입니다. 예전 글을 보다가 제가 작성한 이 문서를 보게 되었는데요, 너무 내용이 빈약하다고

blockdmask.tistory.com

 

'OLD_알고리즘' 카테고리의 다른 글

Solving Skill ] 해시 맵(Hash Map)  (0) 2021.01.22
Solving Skill ] Greedy  (0) 2021.01.17
STL ] Stack  (0) 2021.01.03
STL ] vector - 타 블로그 참고  (0) 2021.01.03
c의 getline()과 c++의 getline()  (0) 2020.11.30

댓글