[c++]string

이승희·2023년 11월 7일

c++

목록 보기
3/6
post-thumbnail

string

  • C++에서의 문자열 처리는 C언어의 방식보다 더 편리해졌으며 달라졌다.
  • C 언어에서는 문자 배열로 생성하여 문자열의 끝 공간에 널값을 주어 생성하는 복잡하게 구현을 하였다면😰 C++에서는 표준 라이브러리에서 제공되는 string 객체 클래스를 이용하여 편리하게 작업을 할 수 있다.😎
  • stirng 문자열은 별다른 헤더 파일 선언 없이 사용은 가능하지만, string 클래스의 주요 함수를 제공 받기 위해서는 #include 선언해야 한다.
#include <string>
  • C언어에서는 문자 배열의 크기를 지정해줘야 했다면 c++에서는 가변 크기의 문자열을 제공하여 따로 크기를 지정해주지 않아도 된다. 이것이 매우 편리해진거 같다 ㅎㅎ❗️
string str;
str = "I Love";

cout << str << endl;

str.append("C++");
cout << str << endl;
✅ 출력결과

—————————————————————————————————————————————

I Love

I Love C++

—————————————————————————————————————————————

string 객체 생성 및 입출력

문자열 생성

string address("oo시 oo구 oo동");
cout << address << endl;

string copyAddress(address);
cout << copyAddress << endl;

//c-스트링(char[])으로부터 스트링 객체 생성
char text[] = { 'L', 'o', 'v', 'e', '\n' };
string title(text);
    
cout << title << endl;
✅ 출력결과

—————————————————————————————————————————————

oo시 oo구 oo동

oo시 oo구 oo동

Love

—————————————————————————————————————————————

  • string address("oo시 oo구 oo동");와 같이 문자열 리터럴 방식으로 초기화 할 수도 있다. 또한 이미 생성된 문자열 리터럴을 또다른 리터럴로 복사하여 초기화할 수 있다.❗️❗️❗️

문자열 출력

string str;
//문자열 입력
cin >> str; //띄어 쓰기 값은 블랭크 입력 전까지만 입력이 됨

cout << str << endl;

    
string str1;
getline(cin, str1, '\n'); //cin 기능을 사용하며 str에다가 입력하고 저장하며 개행 문자가 입력될 시 종료

cout << str1 << endl;
✅ 입력

—————————————————————————————————————————————

aaaaa aaa a a a aaa aa aaa

—————————————————————————————————————————————

출력결과

—————————————————————————————————————————————

aaaaa

aaa a a a aaa aa aaa

—————————————————————————————————————————————

  • cin 방식으로 사용하면 빈칸 혹은 개행이 이루어지는 즉시 입력이 중단된다.
  • 하지만 getline(cin, str1, ‘\n’); 함수를 사용하면 종료 문자로 지정한 개행문자가 입력되기 전까지 str1에 계속해서 입력이 된다.
  • aaaaa까지는 cin의 역할로 빈칸 혹은 개행문자가 발견되었으니 입력을 중단하고 getline이 나머지 입력을 수행한다. 빈칸과 엔터키를 입력하기 전까지 빈칸도 함께 입력된 것을 확인할 수 있다.😃

문자열 숫자 변환

//문자열 => 정수로 변환
string s = "123";
int n = stoi(s);
cout << n << endl;
✅ 출력결과

—————————————————————————————————————————————

123

—————————————————————————————————————————————

  • stoi() 함수를 이용하여 문자열을 정수로 변환할 수 있다.

new/delete를 이용하여 문자열을 동적 생성/반환 가능

//string 객체의 동적 생성
//new, delete
string* p = new string("c++");
cout << *p << endl;

p->append(" Great!"); //동적 할당은 포인터이기 때문에 string 클래스 객체 이므로 ->로 접근
cout << *p << endl;

delete p;
✅ 출력결과

—————————————————————————————————————————————

c++

c++ Great!

—————————————————————————————————————————————

  • string 객체도 동적할당 기능을 사용할 수 있으며 동적할당은 포인터로 이루어져 있으며 기존 C++에서 new 선언하는 방식과 동일하며 동시에 초기화도 할 수 있다.🧐
  • 포인터로 이루어져 있으므로 포인터 문법을 사용하여 접근하며 또한 string의 객체 멤버함수의 기능을 사용하려면 → 를 사용해야 한다. (객체 포인터 접근시 → 를 사용)❗️❗️❗️❗️❗️

string 클래스의 주요 멤버 함수

멤버 함수설 명
append(string str)문자열 뒤에 str 추가
insert(int pos, string str)문자열의 pos 위치에 str 삽입
replace(int pos, int n, string str)문자열의 pos 위치부터 n개 문자를 str 문자열로 대치
size(), length()문자열의 길이 리턴
erase(int pos, int n)문자열의 pos 위치부터 n개의 문자 삭제
clear()문자열 모두 삭제, 크기가 0이 됨
empty()문자열의 크기가 0이면 true, 아니면 false
at(int pos)문자열의 pos 위치의 문자(char) 리턴
find(string str)문자열의 처음부터 str을 검색하여 시작 인덱스를 리턴
compare(string str)문자열과 str을 비교, 같으면 0, 문자열이 작으면 -1, 크면 1
subset(int pos, int n)문자열의 pos 위치부터 n개 문자를 서브스트링으로 생성
swap(string str)현재 객체의 문자열과 str의 문자열을 서로 바꿈

string 클래스의 연산자

string s = "C++";
string s1 = "C";
string s2 = "Java";
연산자설명
s1 = s2s1 = “Java”
s[]char c = s[1] ⇒ c = ‘+’
s1 + s2“CJava”
s1 += s2s1 = “CJava”
s1 == s2false
s1 ! = s2true
s1 < s2true
s1 > s2false
s1 < = s2true
s1 > = s2false

5개의string 배열을 선언하고 getline()을 이용하여 문자열을 입력 받아 사전 순으로 가장 뒤에 나오는 문자열을 출력, 문자열 비교는 <, > 연산자를 간단히 이용한다.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    //문자열 배열 선언
    string names[5];
    
    for (int i = 0; i < 5; i++)
    {
        cout << "이름 : ";
        getline(cin, names[i], '\n');
    }

    string latter = names[0];

    for (int i = 1; i < 5; i++)
    {
        if (latter < names[i])
        {
            latter = names[i];
        }
    }

    cout << "(사전식)가장 뒤에 나오는 이름 = " << latter << endl;

    return 0;
}
✅ 입력

—————————————————————————————————————————————

이름 : ㅁ

이름 : ㄹ

이름 : ㅎ

이름 : ㄷ

이름 : ㅅ

—————————————————————————————————————————————

출력결과

—————————————————————————————————————————————

(사전식)가장 뒤에 나오는 이름 = ㅎ

—————————————————————————————————————————————

빈칸을 포함하는 문자열을 입력 받고, 한 문자씩 왼쪽으로 회전하도록 문자열을 변경하고 출력

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

int main()
{
    string str;

    cout << "문자열 입력(한글 안됨)";

    getline(cin, str);

    //문자열의 길이
    int len = str.length();

    for (int i = 0; i < len; i++)
    {
        //맨 앞에 있는 문자 1개를 읽어옴(분리)
        string first = str.substr(0, 1);
        string sub = str.substr(1, len - 1);
        str = sub + first;
        cout << str << endl;
    }

    

    return 0;
}
✅ 입력

—————————————————————————————————————————————

문자열 입력(한글 안됨)I love you

—————————————————————————————————————————————

출력결과

—————————————————————————————————————————————

love youI

love youI

ove youI l

ve youI lo

e youI lov

youI love

youI love

ouI love y

uI love yo

I love you

—————————————————————————————————————————————

0개의 댓글