본문 바로가기
Language & Framework & GIT/C++

[씨앤씨뿔]C++ / 객체 포인터& 배열 & 동적 생성 - 3

by veganwithbacon 2023. 4. 28.
반응형

 

C++에서 문자열을 다루는 방법은 기존의 C에서 사용했던 

- C-스트링

- string 클래스 

2가지가 있다.

 

C-스트링은 C 언어에서 사용하던 전통적인 문자열로서, '\0'로 끝나는 문자 배열을 문자열로 취급하는 방법이다.

String은 C++표준 라이브러리에서 제공하는 클래스로, 문자열을 객체로 다룬다.

string은 문자열을 저장하는 버퍼와 함께, 문자열을 다루는 다양하고 유용한 함수와 연산자들을 멤버로 가지며, 개발자들이 C-스트링보다 문자열을 쉽게 다룰 수 있다.

 

string 클래스 사용을 위한 코드

#include <string>

using namespace std;

 

C-스트링은 초기에 할당받은 메모리 크기 이상의 문자열을 저장할 수 없기에 개발자의 프로그램 작성에 어려움이 있다

String 클래스는 문자열의 크기에 맞춰 스스로 메모리 크기를 조절하기에 사용하기 매우 편하다.

string str = "I love "; //str은 공백포함 7개 문자

str.append("C++. "); //std은 "I love C++."이 된다.

 

 

✅String 객체 생성 및 출력

  String 객체 생성

string 클래스의 생성자를 이용해 다양한 문자열을 생성할 수 있다. 문자열 크기에는 제한이 없다.

string str; //빈 문자열을 가진 스트링 객체
string address("서울시 성북구 삼선동 389"); //문자열 리터럴로 초기화
string copyAddress(address); 

char text[ ] ={ 'L', 'O', 'V', 'E', ' ', 'C', '+', '+', '\0'}; //C스트링
string title(text);  // 'Love C++'을 지닌 객체 string 생성

 

  String 객체가 가진 문자열 출력

string 객체의 문자열은 cout <<를 이용해 화면에 출력 가능

cout << address << endl; //"위에서 address에 입력한 값을 출력"
cout << title << endl; //마찬가지로 위에서 title에 입력한 값을 출력

 

  String 객체의 동적 생성

string객체도 똑같이 new와 delete를 통해 연산자를 동적으로 생성하고 반환할 수 있다.

string *p=new string("C++");
cout << *p;
p-<append("Great!!");
cout << *p; // "C++ Great!!" 출력
delete p; // 스트링 객체 반환

 

  string 클래스의 주요 생성자

생성자 설명
string() 빈 문자열을 가진 스트링 객체 생성
string(const string& str) str을 복사한 새로운 스트링 객체 생성
string(const char* s) C-스트링 s의 문자열을 복사해 스트링 객체 생성
string(const char* s, int n) 문자 배열 s에서 n개의 문자를 복사해 스트링 객체 생성

 

String 객체에 문자열 입력

string 객체에 문자열 입력

cin >>을 이용해 키보드로부터 string 객체에 문자열을 입력받을 수 있다.

string name;
cin >> name;

>> 연산자는 사용하기 쉬우나, 공백 문자가 입력되면 그 앞까지 하나의 문자로 다루기에 공백 문자를 포함하는 문자열을 사용할 수 없다. <string> 헤더 파일에 선언된 getline() 전역 함수를 이용 

getline()으로 공백 문자가 낀 한 라인의 문자열을 입력받으면

string name;
getline(cin, name, '\n'); // '\n'을 만날 때까지 키보드 (cin)로부터 문자열을 읽어 name에 저장

String의 getline()은 첫번째 인자에는 cin을, 두 번째 인자에는 string 객체를, 세 번째 인자에는 문자열의 마지막을 표시하는 구분 문자(delimiter)를 준다. 위 예시는 name이 '\n'을 만날 때까지 입력된 문자들을 name객체에 문자열로 저장하는 코드다. '\n'은 문자열에 삽입하지 않는다.

 


✅문자열 다루기

  문자열 치환

문자열 치환은 =연산자를 이용

string a = "Java", b = "C++";
a = b; // a="C++"이 된다. a는 b를 복사한 문자열을 가진다.

 

  문자열 비교

문자열 비교는 compare() 함수를 이용한다. 이 함수는 두 문자열이 같으면 0, str보다 사전 순으로 앞에 오면 음수, 뒤에 오면 양수를 리턴한다.

string name = "chang";
stringalias = "ch";
int res = name.compare(alias);
if(res == 0) cout << "두 문자열이 같다.";
else if(res<0) cout<< name << " < " << alias << endl; //name이 앞에 옴
else cout << alias << " < " << name << endl; //name이 뒤에 옴

 

문자열 비교는 비교연산자를 이용하면 보다 효과적이다

if(name == alias) cout << "두 문자열이 같다";
if(name < alias) cout << name << "이 " << alias << "보다 사전에서 먼저 나온다";

 

  문자열 연결

두 개의 문자열을 연결하기 위해 append()함수를 이용한다.

"I" 문자열 끝에 "love"를 추가하는 예

string a("I");
a.append(" love "); //a = "I love "

문자열 연결은 +, += 연산자를 통해 쉽게 작성 가능

string a("I love C++");
string b(" . ");
string c(;
c = a + b;  //c = "I love C++."로 변경됨
c += b;  //c= "I love C++.."로 변경됨

 

  문자열 삽입

string 클래스는 문자열에 새로운 문자열이나 문자의 삽입 삭제가 가능하며, 문자의 일부분을 다른 문자들로 변경 가능

insert()함수를 이용해 a의 인덱스 2 위치에 "really" 문자열을 삽입하는 코드이다.

string a("I love C++");
a.insert(2, "really "); // a = "I really love C++"

replace 함수를 통해 a의 인덱스 2부터 11개의 문자("really love")를 "study"로 대치

a.replace(2, 11, "study"); //a = "I study C++"

 

  문자열 길이

: 문자열에 포함된 문자 개수, length()와 size() 함수는 문자열의 길이를 리턴한다

 

길이와는 달리 string 객체의 내부 메모리 용량을 리턴하는 capacity()도 있다.

용량은 자동으로 조절되어 개발자가 신경쓰지는 않아도 된다.

string a("I study C++");
int length = a.length; // "I study C++"의 문자 개수는 11이다. length = 11;
int size = a.size(); //length()와 동일하게 작동. size = 11;
int capacity = a.capacity(); //스트링 a의 현재 용량 capacity = 31; 변할 수 있음

 

  문자열 삭제

erase()는 문자열의 일부를 삭제, clear는 완전히 삭제

string a("I love C++");
a.erase(0, 7); //a의 처음부터 7개의 문자 삭제. a = "C++"로 변경
a.clear(); // a = ""

 

  서브스트링

substr()함수를 사용하면 문자열에서 일부분을 발췌한 문자열(서브스트링)을 얻을 수 있다.

string b = "I love C++";
string c = b.substr(2,4); // b의 인덱스 2에서 4개의 문자 리턴. c = "lvoe"
string d = b.substr(2); //b의 인덱스 2에서 끝까지 문자열 리턴. d = "love C++"

 

  문자열 검색

문자열 내에 특정 문자열이 존재하는지 검색하는 기능이 많은 응용에서 사용

find()는 문자열에서 특정 문자나 문자열을 발견하면 첫 번째 인덱스를 리턴한다.

발견하지 못하면 -1을 리턴

string e = "I love love C++";
int index = e.find("love"); //e에서 "love"검색. 인덱스 2리턴
index = e.find("love", index+1); //e의 인덱스 3부터 "love"검색. 인덱스 7리턴
index = e.find("C#"); //e에서 "C#"을 발견할 수 없음. -1리턴
index = e.find('v', 7); //e의 인덱스 7부터 'v'문자 검색. 인덱스 9리턴

 

  문자열의 각 문자 다루기

at()함수와 [ ] 연산자는 둘 다 문자열의 특정 위치에 있는 문자를 리턴한다.

at()와 [ ] 연산자를 통해 특정 문자를 다른 문자로 수정할 수 있다.

string f("I love C++");
char ch1 = f.at(7); //문자열 f의 인덱스 7에 있는 문자 리턴. ch1 = 'C'
char ch2 = f[7]; // f.at(7)과 동일한 표현. ch2 = 'C'
f[] = 'D'; // f는 "I love D++"

 

문자열 f의 마지막 문자는 다음과 같다.

char ch = f.at(f.length()-1);  //ch은 '+'

 

  문자열의 숫자 변환, stoi()

C++11 표준부터는 문자열을 숫자로 변환하는 전역 함수 stoi()를 추가.

String year = "2014";
int n = stoi(year); //n은 정수 2014값을 가짐
// int n = atoi(year.c_str()); //비주얼 C++ 2008이하

 

  문자 다루기 

string은 문자열만 다룰뿐, 문자에 대한 기능은 없다

문자를 다루는 함수는 <locale> 헤더 파일에 존재한다

string a = "hello";
for(int i=0; i<a.length(); i++) a[i] = toupper(a[i]); //a가 "HELLO"로 변경
cout << a' // "HELLO"출력
if(isdigit(a[0]))cout<<"숫자";
else if(isalpha(a.at(0))) cout << "문자"; //a[0]은 문자 'H'

대충 설명도 없이 예시만 덩그러니 던져놔서 따로 공부했다.
https://veganwithbacon.tistory.com/252

 

[씨앤씨뿔] toupper & tolower함수 : <locale> -1

헤더 파일에 있는 함수 친구들을 하나씩 알아보는 중이다. 그 중 첫번째.. 두둥탁 C& C++ toupper & tolower 함수 헤더파일? C언어 : < ctype.h> C++ : toupper ? int toupper(int c); >> 매개변수 : 문자를 인자로 받는

veganwithbacon.tistory.com

https://veganwithbacon.tistory.com/253

 

[씨앤씨뿔] isdigit 함수 : <locale> - 2

헤더 파일에 있는 함수 친구들을 하나씩 알아보는 중이다. 그 중 두 번째.. 두둥탁 C & C++ isdigit함수 int isdigit ( int c ); 함수의 매개변수로 char형을 입력하게 되면, 입력을 한 char형이 숫자에 해당하

veganwithbacon.tistory.com

https://veganwithbacon.tistory.com/255

 

[씨앤씨뿔] isalpha 함수 : <locale> - 3

헤더 파일에 있는 함수 친구들을 하나씩 알아보는 중이다. 그 중 세 번째.. 두둥탁 C & C++ isalpha함수 int isalpha ( int c ); : 매개변수로 들어온 인자가 알파벳이라면 0이 아닌 수를 반환하고 알파벳이

veganwithbacon.tistory.com

 

반응형

댓글