자료구조 | C++ | 문자열

2024. 3. 17. 08:50·개발/C++
목차
  1. 개요
  2. null 종료 문자열
  3. string 클래스
  4. string 라이브러리
  5. 멤버 변수들
  6. 마치는 말

개요

오늘은 문자열에 대해서 배웠습니다.

string 클래스와 각종 메서드에 대해서 배웠는데 반복자인지 뭔지는 이해가 조금 어렵지만
코드를 보면 대충은 읽을 수 있게 됐죠.

 

C#보단 C++이 이런부분에선 확실히 편한것 같습니다.

 

 


 

 

null 종료 문자열

#include <iostream>

using namespace std;

int main()
{
	char c[] {'h','e','l','l','o'};

	cout << c;
}

 

hello 라는 값이 담긴 char 배열을 출력해보면

 

 

이런 이상한 한자들이 같이 출력되는걸 볼 수 있는데 이건 C++이 문자열의 끝을 인식하지 못해서 이상한 값까지 읽어들이기 때문입니다.

 

그렇기 때문에

char c[] {'h','e','l','l','o', '\0'};

'\0' 문자로 null을 명시적으로 표시해줄 수 도 있지만 번거롭죠?

그래서

char c[]  = "hello";

큰 따옴표로 묶어서 넣어주면 알아서 문자열 끝에 null이 들어갑니다.
C#은 일일히 .ToCharArray(); 같은 메서드를 쓰면서 넣어줘야 하는데 C++은 그딴거 없네요

 

문자열 끝에 null이 들어간단 사실은

	char c[] = "hello";

	cout << sizeof(c); // 출력결과 6

5글자인 char 배열의 byte가 6인것을 보면 알 수 있습니다.

 

 


 

 

string 클래스

C++ 은 여타 다른 언어들처럼 문자열을 하나로 묶어 저장하기 위해 우리들이 다 아는 string 클래스를 제공합니다.

 

문자열끼리 더하거나

string s1 = "아";
string s2 = " 집가고싶다.";
cout << s1 + s2; // 출력 결과 : 아 집가고싶다.

대소비교가 가능합니다.

string s1 = "가";
string s2 = "나";
s1 < s2 ? cout << s1 << " 이(가) 사전순으로 앞입니다." 
: cout << s2 << "이(가) 사전순으로 앞입니다.";

// 출력 결과 : 가 이(가) 사전순으로 앞입니다.

 

 


 

 

string 라이브러리

사실 string은 클래스가 아니라 라이브러리가 본체입니다.

변수 하나에 한줄에 들어온 입력을 띄어쓰기 상관없이 받아올 수 있는 getline() 같은게 예죠.

string s;
getline(cin, s);

 

네? getline 그거 iostream에도 있다구요?

char c[100]
cin.getline(c, 100);

 

하지만 불편하게 크기까지 정해가면서 문자열을 담지 않아도 됩니다.
더 편하시잖아. 한잔해.

 

근데 getline은 cin과 충돌이 일어납니다.

int n;
cin >> n;

string s;
getline(cin, s); // 무시됨

int m;
cin >> m;

cout << n << endl;
cout << s << endl;
cout << m << endl;

입력 :
2
3

출력 :
2


3

 

어? 분명히 입력을 3개 받았는데 내가 입력을 3개 치기전에 출력을 해버립니다.
왜냐하면 cin으로 입력을 받으면 버퍼에 '\n' 이 남기 때문인데

다음 입력도 cin으로 받으면 전 버퍼에 있던 공백이나 개행을 무시해서 상관없지만
getline으로 받을경우 전 버퍼에 있던 공백과 개행을 전부 포함해서 받습니다.

 

그렇기 때문에 내가 치지 않은 엔터가 쳐져서 s 에 그냥 비어있는 값이 할당된겁니다.

 

이걸 해결하려면 getline()을 실행하기 전 cin.ignore() 라는 함수를 실행해서 버퍼를 비워줘야 합니다.

int n;
cin >> n;

cin.ignore();
string s;
getline(cin, s);

int m;
cin >> m;

cout << n << endl;
cout << s << endl;
cout << m << endl;

입력 :
2
asdf
3

출력 :
2
asdf
3

 

아주 잘되죠?

 

 


 

 

멤버 변수들

 

이거저거 많은데 하나하나 설명하긴 좀 힘드니까 넘어가겠습니다.


 

 

마치는 말

C++이 참 자유도가 높은 언어 같아요.

파면 팔수록 어? 이게 돼? 싶은게 많아요.

 

알고리즘 문제도 풀어보면서 C++에 재미를 좀 붙이고 있는데 파면 팔수록
기괴하고 이상하고 불안정하고 빠르고 불친절하지만 매력적인 언어 같습니다.

'개발 > C++' 카테고리의 다른 글

자료구조 | C++ | 클래스  (1) 2024.04.05
자료구조/게임 프로그래밍 | C++ | 함수, 포인터  (1) 2024.03.28
게임 프로그래밍 | C++ | 랜덤  (2) 2024.03.22
자료구조 | C++ | 기본 개념  (1) 2024.03.07
자료구조 | C++ | 기초사항  (3) 2024.03.06
  1. 개요
  2. null 종료 문자열
  3. string 클래스
  4. string 라이브러리
  5. 멤버 변수들
  6. 마치는 말
'개발/C++' 카테고리의 다른 글
  • 자료구조/게임 프로그래밍 | C++ | 함수, 포인터
  • 게임 프로그래밍 | C++ | 랜덤
  • 자료구조 | C++ | 기본 개념
  • 자료구조 | C++ | 기초사항
SundG0162
SundG0162
블로그 프로필은 머핀입니다.
  • SundG0162
    게임개발고수가될거야
    SundG0162
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 주저리 (3)
        • 잡담 (2)
        • 장현우 (0)
        • 회고록 (1)
      • 개발 (50)
        • CITADEL : 성채 (1)
        • HEXABEAT (1)
        • FRACTiLE (6)
        • UNNAMED (9)
        • Default Defense (10)
        • T-Engine (1)
        • Project EW (0)
        • 졸업작품 (0)
        • Unity (3)
        • C# (4)
        • C++ (13)
        • WinAPI (1)
        • 그 외 (0)
      • 알고리즘 (13)
        • C# (1)
        • C++ (12)
      • 자료구조 (2)
        • C++ (1)
        • C# (0)
        • 공용 (1)
      • 기타 (10)
        • 아트 (6)
        • AI (2)
        • 수학 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C#
    AI
    생성형ai
    코딩
    코드트리
    코딩트리조별과제
    코딩테스트
    티스토리챌린지
    LLM
    오블완
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
SundG0162
자료구조 | C++ | 문자열
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.