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++프로그램을 실행하고 다음과 같이 각각 입력할 때 출력 결과를 작성하시오.
- 입력: Hello World
- 입력: Programming Language
- 입력: Yes Yes
C문자열 입출력 방법은 단어(word) 입력과 줄(line) 입력이 있다. 단어 입력은 공백(' ')으로 구분된 문자열을 입력 받고, 줄 입력은 줄 바꿈 문자('\n')로 구분된 문자열을 입력 받는다.
char str1[MAX_LEN], str2[MAX_LEN];
cin >> str1; // 단어 입력
cin.getline( str2 , MAX_LEN ); // 줄 입력
Q2. 단어 입력과 줄 입력을 받는 위의 코드를 실행하고 다음과 같이 각각 입력할 때 str1과 str2에 입력되는 문자열을 작성하시오.
- 입력: Hello World
- 입력: 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. 위 프로그램의 실행 결과를 작성하시오.