[C++] 문자열 | string을 전달인자로 하는 함수

2025. 5. 2. 17:47·C++

문자열

  • 모든 문자열의 마지막 문자는 반드시 널 문자(\0)여야 함!!
    • ex) char fruit1[8] = {'a', 'p', 'p', 'l', 'e'};   // 문자열이 아님
    •        char fruit2[8] = {'a', 'p', 'p', 'l', 'e', '\0'};   // 문자열임
  • 큰 따음표로 묶인 문자열은 마지막에 널 문자가 들어가있음
  • C++에 다양한 입력 기능들에도 끝내기 널 문자가 자동으로 추가됨

 

const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];

cout << "이름을 입력하십시오 : \n";
cin >> name;
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin >> dessert;
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";

 

 

  • cin이 문자열 끝을 인식하는 방법 : 빈칸, 탭, 캐리지 리턴과 같은 화이트 스페이지! 
  • Polibo Park 이라고 입력 ===> Polibo\0 와 Park\0로 인식함
  • 그럼 어떻게 되냐!! 두번째 입력에 Park\0이 들어가니까! 두번째 입력은 받지 않아버림!!!!!!!!!

 

 

  • 단어 단위가 아닌 한 행의 문자열을 한번에 읽고 싶다면 getline()과 get()을 사용하면 됨.
  • 둘 다 전체 입력 행을 읽어줌 ==> 개행문자(\n)이 나올 때까지 읽음!!! 
  • 그럼 차이점은 무엇이냐?
    • getline() : 개행 문자 읽고 폐기
    • get() : 개행 문자 읽고 입력 큐에 개행 문자 남겨 둠

 

★ cin.getline()

cout << "이름을 입력하십시오 : \n";
cin.getline(name, ArSize);
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin.getline(dessert, ArSize);
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";

 

 

  • 빈칸이 있는 입력이지만, cin과 다르게 개행이 나올 때까지 읽음
  • But, 개행 문자 저장 XXXXXX
  • 문자열을 배열에 저장할 때, 개행 문자는 널 문자로 대체됨

 

 

★ cin.get()

  • get()은 getline()과 같이 개행 문자를 만날 때까지 읽지만, 개행 문자를 읽어서 버리지 않고, 입력 큐에 그대로 남겨둠
  • 처음 입력을 하고 나면, 개행 문제가 입력 큐에 남아있어서 다음 입력을 못 받음!!! 
    • ===> 개행 제거 해줘야 함!
cout << "이름을 입력하십시오 : \n";
cin.get(name, ArSize);
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin.get(dessert, ArSize);
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";

 

  • get()의 매개변수 자리를 비워두면 개행 문자이든 뭐든 무조건 문자 하나를 읽음
  • 그럼 남아있는 개행 제거 가능가능~~~
  • 방법은 아래 코드를 보시오!
cout << "이름을 입력하십시오 : \n";
cin.get(name, ArSize).get();
cout << "좋아하는 디저트를 입력하십시오 : \n";
cin.get(dessert, ArSize).get();
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다. " << name << " 님!\n";

 

 

 

string 클래스

  • 문자열을 저장하기 위해 문자 배열 대신 string형 사용 가능
  • string 헤더 파일 필요
  • 크기를 프로그램이 자동으로 처리 --> 크기 입력X
  • 선언만 하면, 길이 = 0
  • 입력을 받으면 크기 자동 조절
char char1[20];
char char2[20] = "apple";
string str1;
string str2 = "banana";

cout << "과일 한 종류를 입력하세요 : ";
cin >> char1;
cout << "다른 과일 한 종류를 입력하세요 : ";
cin >> str1;
cout << "아래에 있는 것들은 모두 과일입니다 : \n";
cout << char1 << " " << char2 << " " << str1 << " " << str2 << endl;
cout << char2 << "에서 3번째 글자 : " << char2[2] << endl;
cout << str2 << "에서 3번째 글자 : " << str2[2] << endl;

 

  • string 클래스의 특징
    • string 객체 C 스타일 문자열로 초기화 가능
    • cin을 사용하여 string 객체에 입력 저장 가능
    • cout을 사용하여 출력 가능
    • 인덱싱 가능
    • 대입 가능!
      • string str1;
      • string str2 = "apple";
      • str1 = str2
      • 배열은 대입안되지만! string 객체는 대입 가능!
    • 결합 가능!
      • string str3;
      • str3 = str1 + str2;    // 결합된 두 string 객체를 str3에 대입
      • str1 += str2;    // str1 끝에 str2 추가
string str1 = "banana";
string str2, str3;

cout << "str1 : " << str1 << endl;
str2 = str1;
cout << "str2 : " << str2 << endl;

str2 = "apple";
str3 = str1 + str2;
cout << "str3 : " << str3 << endl;

str3 = " is delicious";
str1 += str3;
cout << "str1 : " << str1 << endl;

 

 

  • 위와 같은 기능은 C언어에서 사용했던 strcpy(), strcat() 함수와 같음
  • 하지만, string 클래스는 크기를 자동으로 할당해주기 때문에, 메모리관련 오류 걱정이 없음!!
  • 문자 길이 구할 때는 .size()를 쓰면 됨.

 

  • string 객체 입력하기
  • 여기서, getline()의 사용법을 자세히 봅시다!!
  • char를 사용할 때에는 cin.getline(name, size)를 사용했음
  • 도트(.)표시 : getline() 함수가 istream 클래스를 위한 클래스 메서드임을 나타냄
  • 아래 코드를 보면 getline()을 단독으로 쓴 것을 볼 수 있음
  • 도트 없음 : getline()이 클래스 메서드가 아님을 나타냄
  • size도 안적음!!!! ---> string 객체는 크기를 자동으로 할당 ---> size 필요X
string str;

cout << "입력 이전 str 문자열 길이 : " << str.size() << endl;
cout << "텍스트 한 행 입력 : ";
getline(cin, str); // cin : 표준 입력
cout << "입력한 텍스트 : " << str << endl;
cout << "입력 이후 str 문자열 길이 : " << str.size() << endl;

 

 

 

string을 전달인자로 받는 함수

  • 새로운 자료형인 string도 함수의 전달인자로 사용 가능
  • 아래 코드는 string 객체를 담은 배열과 그 크기를 전달인자로 받아 출력해주는 함수를 사용하는 예시임
#include <iostream>
#include <string>

using namespace std;
const int SIZE = 5;

void display(const string sa[], int n);

int main()
{
    string list[SIZE]; // string 객체 5개를 담는 배열 list

    cout << "과일을 " << SIZE << "개 입력하세요:\n";
    for (int i = 0 ; i < SIZE ; i++) // 5번 입력 받음
    {
        cout << i + 1 << " : ";
        getline(cin, list[i]);
    }

    cout << "\n입력한 내용 : \n";
    display(list, SIZE);

    return 0;
}

// string 배열과 크기를 전달인자 받아 출력해주는 함수
void display(const string arr[], int n)
{
    for (int i = 0 ; i < n ; i++)
    {
        cout << i+1 << " : " << arr[i] << endl;
    }
}

 

'C++' 카테고리의 다른 글

[C++] 주요 vector 함수  (0) 2025.05.06
[C++] array 객체와 vector 객체  (0) 2025.05.06
[C++] 파일 입출력 (.txt 파일)  (0) 2025.05.05
[C++] cin.fail() | cin.clear() | cin.ignore()  (0) 2025.05.05
[C++] 데이터 형변환  (0) 2025.05.02
'C++' 카테고리의 다른 글
  • [C++] array 객체와 vector 객체
  • [C++] 파일 입출력 (.txt 파일)
  • [C++] cin.fail() | cin.clear() | cin.ignore()
  • [C++] 데이터 형변환
polibo
polibo
Polibo의 개발 성장기 지켜봐주십슈 (콩 싫어해요.)
  • polibo
    Polibo와 개발 콩나무 키우기
    polibo
  • 전체
    오늘
    어제
    • 분류 전체보기 (65)
      • Python (23)
      • C (32)
        • 본수업 (19)
        • 예습 (7)
        • 개인프로젝트01 - 로또 (3)
        • 개인프로젝트02 - 복켓몬 키우기 (2)
        • 개인프로젝트03 - 김복천국 POS기 (1)
        • 팀프로젝트01 - 용사 복이의 대모험 RPG (0)
        • 팀프로젝트02 - 메일 프로그램 (0)
      • TCP_IP (0)
      • DB (1)
      • C++ (7)
        • 개인프로젝트01 - 숫자야구 (0)
      • QT (1)
        • 개인프로젝트01 - 숫자야구 (0)
        • 팀프로젝트01 - 키오스크 (1)
        • 팀프로젝트02 - 퐘퐘이 (0)
        • 팀프로젝트03 - 개발의 민족 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    c언어 scanf
    while문
    코딩
    파이썬
    파이썬게임
    else if
    파이썬조건문
    문자열
    순서도
    if문
    파이썬예제
    Python
    c언어
    c우선순위
    for문
    C
    반복문
    파이썬 숫자야구
    파이썬반복문
    조건문
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
polibo
[C++] 문자열 | string을 전달인자로 하는 함수
상단으로

티스토리툴바