[CPP] CPP 문자열

Copyright (c) 2016-, All Rights Reserved by Kwanghoon Choi
(아래 CPP 프로그래밍 강의 교재의 내용을 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.)

목차

1. C문자열과 C++문자열

1.1 C문자열

"Hello World"와 같이 큰 따옴표로 묶인 문자들을 문자열이라고 한다. C언어에서 이 문자열을 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0'을 차례로 메모리에 저장해서 표현한다. 각 문자는 아스키코드의 숫자다. 예를 들어, 'H'는 아스키코드에서 H에 해당하는 숫자 72(16진수로 0x48)이다. C언어에서 문자열의 마지막은 널 문자 '\0'로 끝난다. '\0'은 숫자 0이다.

C언어 문자열을 저장하려면 문자 배열 변수를 선언한다.

char str[MAX_LENGTH] = "Hello";

char str[MAX_LENGTH] = { 'H', 'e', 'l', 'l', 'o', '\0' };

배열 변수와 첨자를 이용해서 문자열에 포함된 개별 문자를 선택할 수 있다. 예를 들어, str[0]은 'H', str[5]는 '\0'이다.

C언어에서 문자열을 다루는 strcpy, strcat, strcmp 등과 같은 다양한 라이브러리 함수를 제공한다. 이 함수들을 사용하기 위해서 C프로그램에서 #include <string.h>를 선언한다. C++프로그램에서도 비슷하게 #include <cstring>을 선언해서 C 문자열을 다루는 라이브러리 함수를 사용한다.

    // cstr.cpp
 1: #include <iostream>
 2: #include <cstring>
 3: using namespace std;

 4: #define MAX_LEN 100
 5: int main() {
 6:  char str1[MAX_LEN], str2[MAX_LEN], str3[MAX_LEN];

 7:  cin >> str1 >> str2;

 8:  int c = strcmp(str1, str2);
 9:  if ( c == 0 ) strcpy (str3, str1);
10:  else if ( c < 0 ) {
11:    strcpy(str3, str1);
12:    strcat(str3, ", ");
13:    strcat(str3, str2);
14:  }
15:  else { // c > 0
16:    strcpy(str3, str2);
17:    strcat(str3, ", ");
18:    strcat(str3, str1);
19:  }

20:  cout << str3 << endl;

21:  return 0;
22: }

Q1. 위의 C++프로그램을 실행하고 다음과 같이 각각 입력할 때 출력 결과를 작성하시오.

  1.  입력: Hello World
  2.  입력: Programming Language
  3.  입력: Yes Yes

C문자열 입출력 방법은 단어(word) 입력과 줄(line) 입력이 있다. 단어 입력은 공백(' ')으로 구분된 문자열을 입력 받고, 줄 입력은 줄 바꿈 문자('\n')로 구분된 문자열을 입력 받는다.

char str1[MAX_LEN], str2[MAX_LEN];

cin >> str1;  // 단어 입력
cin.getline( str2 , MAX_LEN ); // 줄 입력

Q2. 단어 입력과 줄 입력을 받는 위의 코드를 실행하고 다음과 같이 각각 입력할 때 str1과 str2에 입력되는 문자열을 작성하시오.

  1.  입력: Hello World
  2.  입력: Hello Programming Language

단어와 줄 입력을 받는 방법과 함께 문자를 입력받으려면 아래의 두 가지 방법을 사용한다.

char ch1, ch2;

cin >> ch1;  // 문자 입력 (공백을 입력받지 않음)
cout << ch1;

cin.get ( ch2 ); // 문자 입력 (공백이나 줄 바꿈 문자도 입력 받음)
cin.put ( ch2 );

개별 문자 단위로 입력 받는 방법은 공백이나 줄 바꿈 입력 여부에 따라 입력된 결과가 예상했던 바와 다를 수 있다. 문자를 입력 받는 대신 단어나 줄을 입력 받는 방식을 사용해서 이러한 미묘한 에러를 피하는 것을 권장한다.

C문자열과 관련된 라이브러리 함수로 toupper(ch), tolower(ch), isdigit(ch), isalpha(ch) , isspace(ch) 등이 있다. 이 라이브러리 함수를 사용하려면 C프로그램에서 #include <ctype.h>를 선언한 것과 유사하게,  C++프로그램에서  #include <cctype>을 선언한다.

Q3. toupper, tolower, isdigit, isalpha, isspace 함수의 기능을 각각 설명하시오.

 

1.2 C++ 문자열 (표준 스트링 클래스 string)

C++프로그램에서 C언어의 문자열을 그대로 사용할 수 있지만, string 클래스의 객체로 표현한 문자열을 사용한다. 즉 C 문자열과 C++ 표준 문자열, 두 가지 형태로 문자열을 표현한다.

string 클래스를 사용한 C++문자열을 사용하면 문자열의 최대 길이를 지정하지 않아도 되고, ==연산자와 <,>연산자, 할당연산자 =, 두 문자열 붙이기 연산자 +를 사용해서 문자열을 매우 편리하게 다룰 수 있다.

앞에서 소개한 C문자열을 사용하는 예제 cstr.cpp와 똑같이 동작하지만, C++문자열을 사용하도록 변경해서 아래와 같이 cppstr.cpp를 작성하였다.

    // cppstr.cpp
 1: #include <iostream>
 2: #include <string>
 3: using namespace std;

 4: int main() {
 5:  string str1, str2, str3;

 6:  cin >> str1 >> str2;

 7:  if ( str1 == str2 ) str3 = str1;
 8:  else if ( str1 < str2 ) {
 9:    str3 = str1;
10:    str3 = str3 +  ", ";
11:    str3 = str3 + str2;
12:  }
13:  else { // str1 > str2
14:    str3 =  str2;
15:    str3 = str3 + ", ";
16:    str3 = str3 + str1;
17:  }

18:  cout << str3 << endl;

19:  return 0;
20: }

Q4.  cstr.cpp와  cppstr.cpp 프로그램을 서로 비교하여 기능적으로 서로 유사한 부분을 짝지어 모두 나열하고 구문의 유사한 점과 차이점을 비교 설명하시오.

  • 예시1)

cstr.cpp: Line 2
cppstr.cpp: Line 2

C문자열 라이브러리를 사용하기 위해 #include <cstring>을 선언하고, C++표준 스트링 클래스를 사용하기 위해 #include <string>을 선언함.

  • 예시2)

cstr.cpp: Line 4와 6
cppstr.cpp: Line 5

C문자열을 저장하는 문자 배열 변수와 C++문자열을 저장하는 string 클래스의 객체 변수 선언. 후자의 경우 최대 길이를 미리 지정할 필요가 없다.

  • 나머지 유사한 부분을 모두 나열하고 차이점을 간단하게 설명하시오.

 

Q5. cppstr.cpp의 Line 9~11과  Line 14~16을 각각 간단하게 한 문장으로 다시 작성하시오.

 

C++ 문자열 (string 클래스의 객체로 표현한 문자열)로 단어와 줄을 입력 받는 방법은 다음과 같다.

string str1, str2;

cin >> str1;  // 단어 입력
getline( cin, str2 );  // 줄 입력. getline은 일반 함수

C문자열과 C++문자열을 서로 변환할 수 있다. 먼저, C문자열 변수를 string 객체 변수에 할당해서 C문자열을 string 객체로 변환한다.

char cstr[MAX_LEN];
string str;
...
str = cstr;    // string 클래스의 할당연산자를 통해
               //    cf. string& string::operator=(const char* cstr) 

string 클래스에서 제공하는 멤버 함수 c_str을 통해 string 객체를 C문자열로 변환한다.

string str;
char cstr[MAX_LEN];
...
strcpy( cstr, str.c_str() );    // string 클래스의 c_str()을 통해
               //    cf. const char* string::c_str() 

 

string 클래스에서 문자열을 다룰 때 편리한 몇 가지 멤버 함수를 제공한다.

  • str[i]의 첨자 연산자 : str 문자열에서 i번째 첨자 위치의 문자
  • str.subst(pos, length) : pos 첨자 위치에서 length 길이의 부분 문자열을 만들어 반환
  • str.find(str1) 또는 str.find(str1, pos) : str에서 str1 부분 문자열을 (처음부터 또는 pos 첨자 위치부터) 찾아 그 첨자 위치를 반환. 못찾으면 -1을 반환.
  • str.length() : str의 길이를 반환
1: string str = "Hello World";
2: cout << str[0] << str[6]; 
3: cout << str.subst(0, 5) << str.subst(6,5);
4: cout << str.find("Hello");
5: cout << str.find("World");
6: cout << str.find("Hello", 1); 
7: cout << str.length();

Q6. 위 프로그램의 실행 결과를 작성하시오.

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *