..

Search

28) C언어 스타일의 문자열

28) C언어 스타일의 문자열

C언어 스타일의 문자열


C++ 문자열

문자열(string)이란 메모리에 저장된 일련의 연속된 문자(character)들의 집합을 의미합니다.

C++에서는 이러한 문자열을 다음과 같은 두 가지 방법으로 생성할 수 있습니다.

 

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

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


C언어 스타일의 문자열

C++에서는 큰따옴표("")를 사용해 표현되는 문자열을 문자열 상수(string constant)라고 합니다.

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

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

 

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

널(NULL) 문자

C++에서 문자형 배열로 선언된 문자열 변수는 문자열의 끝을 프로그램에 따로 알려주어야 합니다.

그래야만 프로그램이 실제 문자열에 속한 값과 그 외의 쓰레깃값을 구분할 수 있습니다.

 

따라서 문자열에 속한 데이터가 끝나면, 문자열의 끝을 의미하는 문자를 하나 더 삽입해 줍니다.

이러한 문자를 널(NULL) 문자라고 하며, '\0'으로 표시하고 아스키코드값은 0입니다.

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

 

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

문자열 입력

C++에서 문자열을 입력받기 위해서는 문자열이 저장될 문자형 배열을 미리 생성해야 놔야 합니다.

예제

const int SIZE = 20;

char address[SIZE];

char name[SIZE];

 

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];

 

cout << "자신의 이름을 적어주세요 : ";

cin.get(name, SIZE).get();

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

cin.get(address, SIZE).get();

 

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

실행 결과

자신의 이름을 적어주세요 : 이 순신

자신이 살고 있는 도시를 적어주세요 : 부산

부산에 살고 있는 이 순신님~ 감사합니다!

 

위의 예제는 띄어쓰기를 포함한 이름이나 도시명을 정확히 입력할 수 있게 되었습니다.

하지만 아직도 20바이트 이상의 이름을 입력할 경우, 도시명을 입력받지 못하는 문제점을 안고 있습니다.

이 문제는 cin 객체의 ignore() 메소드를 사용하여 다음처럼 수정할 수 있습니다.

예제

const int SIZE = 20;

char address[SIZE];

char name[SIZE];

 

cout << "자신의 이름을 적어주세요 : ";

cin.get(name, SIZE).ignore(SIZE, '\n');

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

cin.get(address, SIZE).ignore(SIZE, '\n');

 

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

실행 결과

자신의 이름을 적어주세요 : abcdefghijklmnopqrstuvwxyz

자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ

ABCDEFGHIJKLMNOPQRS에 살고 있는 abcdefghijklmnopqrs님~ 감사합니다!

 

위의 예제의 실행결과를 살펴보면, 20바이트 이상의 이름이나 도시명을 입력해도 정확히 20바이트까지만 입력받고 있는 것을 확인할 수 있습니다.

 

C언어 스타일의 문자열 입력에서는 입력할 문자열의 길이를 미리 알고 있어야만 합니다.

하지만 C++에서 제공하는 string 클래스를 이용하면 다음처럼 아주 간단하게 그 문제를 해결할 수 있습니다.

예제

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

}

실행 결과

자신의 이름을 적어주세요 : 가나다라마바사아자차카타파하

자신이 살고 있는 도시를 적어주세요 : ABCDEFGHIJKLMNOPQRSTUVWXYZ

ABCDEFGHIJKLMNOPQRSTUVWXYZ에 살고 있는 가나다라마바사아자차카타파하님~ 감사합니다!

 

위의 예제는 앞서 살펴본 문자열의 띄어쓰기 문제나 문자열의 길이와 상관없이 모든 문자열을 정확히 입력받을 수 있습니다.


C언어 문자열 처리 함수

C++에서는 C언어 스타일의 문자열을 처리하기 위해 C 라이브러리의 문자열 처리 함수를 사용할 수 있습니다.

이러한 C언어의 문자열 라이브러리를 사용하기 위해서는 우선 cstring 헤더 파일을 포함해야 합니다.

 

C언어 문자열 처리 함수에 대한 더 자세한 사항은 C언어 문자열 처리 함수 수업에서 확인할 수 있습니다.

 

C언어 문자열 처리 함수 수업 확인 =>


연습문제