17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용
C 스타일과 C++ 스타일의 문자열 C 언어에서 물려받은 문자열 처리 함수를 사용해서 문자열을 처리하는 방법과, C++ 에서 새로 생긴 문자열 클래스를 사용하는 방법이 있다. C++ 스타일이 보다 개선된 방법이지만 기존에 만들어진 많은 소스 코드에서 C 스타일을 사용하고 있기 때문에 두 가지 스타일을 배워야 한다.
문자열의 길이와 복사 C 스타일의 함수를 사용해서 문자열을 복사하는 예 실행 결과 #include <cstring> using namespace std; // 중간 생략 char src[] = "Hanbit-Media"; int len = strlen(src); // 1. 원본 문자열의 길이를 잰다. char* dest = new char [len + 1]; // 2. 새 문자열이 담길 메모리를 할당한다. strcpy(dest, src); // 3. 문자열을 복사한다. cout << "src = " << src << "\n"; cout << "dest = " << dest << "\n"; delete[] dest; [17-3]
strlen() strlen() 함수를 사용해서 문자열의 길이를 잴 수 있다. [17-4] [17-5]
strcpy() strcpy() 함수를 사용해서 문자열의 내용을 복사할 수 있다. [17-6] [17-7]
문자열의 비교와 결함 C 스타일의 함수를 사용해서 문자열을 결합하고 비교하는 예 실행 결과 #include <cstring> using namespace std; // 중간 생략 char str1[20] = "abcde"; char str2[] = "fghij"; strcat(str1, str2); if ( strcmp( str1, "abcdefghij") == 0) cout << "str1 and \"abcdefghij\" are identical.\n"; if ( strcmp( "123456", str1) != 0) cout << "\"123456\" and str1 are NOT identical.\n"; [17-8]
strcat() strcat() 함수를 사용해서 문자열을 결합할 수 있다. [17-9] [17-10]
strcmp() strcmp() 함수를 사용해서 문자열의 내용을 비교할 수 있다. [17-11] [17-12]
문자열 다시 보기 문자열은 정보의 한 종류고, 문자열을 저장하기 위해서는 배열을 사용하거나 동적으로 메모리를 할당할 필요가 있다. C++에서는 문자열의 첫번째 바이트의 주소를 사용해서, 전체 문자열을 지칭한다. 대부분의 경우에 char* 타입의 변수는 문자열을 가리킨다고 생각해도 된다. [17-13] [17-14] // p: 문자열을 넣어야 한다. void Function( char* p );
문자열 리터럴(Literals) 다시 보기 문자열 리터럴은 문자열의 시작 주소로 해석된다. char* p = “abcde”; [17-18]
C++ 스타일의 문자열 생성 C++ 스타일의 문자열 변수를 생성하는 예 실행 결과 #include <iostream> #include <string> using namespace std; int main() { string s = "C++ Style~"; cout << s << "\n"; return 0; } [17-21] [17-20]
문자열의 복사 C++ 스타일의 문자열을 복사하는 예 실행 결과 #include <string> using namespace std; // 중간 생략 string src = "Hanbit-Media"; string desc; // 문자열의 내용을 복사한다. desc = src; cout << "src = " << src << "\n"; cout << "desc = " << desc << "\n"; [17-22]
문자열의 길이 C++ 스타일의 문자열의 길이를 구하는 예 실행 결과 #include <string> using namespace std; // 중간 생략 string s1; string s2 = "123"; string s3 = "abcdefg"; cout << "s1 = " << s1.size() << "\n"; cout << "s2 = " << s2.size() << "\n"; cout << "s3 = " << s3.size() << "\n"; [17-23]
문자열의 결합과 비교(1) C++ 스타일의 문자열을 결합하고 비교하는 예 실행 결과 #include <string> using namespace std; // 중간 생략 string str1 = "abcde"; string str2 = "fghij"; // 두 문자열을 결합한다. str1 = str1 + str2; if ( str1 == "abcdefghij“ ) cout << "str1 and \"abcdefghij\" are identical.\n"; if ( "123456" != str1 ) cout << "\"123456\" and str1 are NOT identical.\n"; [17-25]
문자열의 결합과 비교(2) + 연산자를 사용해서 두 문자열을 결합할 수 있다. ==와 != 연산자를 사용해서 두 문자열을 비교할 수 있다. [17-26] [17-27]
문자열의 검색 문자열 내에서 원하는 문자열을 찾아내는 예 실행 결과 #include <string> using namespace std; // 중간 생략 string text = "Napster's pay-to-play service is officially out, " "and we have a review of the now-legit Napster. " "We also size up its companion music player from Samsung."; // 이 문자열 안에서 'official' 이라는 단어의 위치를 찾는다. cout << "Offset of 'official' = " << text.find( "official" ) << "\n"; [17-29] [17-28]
문자열의 일부분 얻기(1) 전체 경로에서 확장자 부분만 얻는 예 실행 결과 #include <string> using namespace std; // 중간 생략 string path = "c:\\My Document\\Pictures\\33.jpg"; int len = path.size(); string ext = path.substr( len - 3, 3); // 맨 뒤쪽의 3 문자만 얻어온다. cout << "extention = " << ext << "\n"; [17-28]
문자열의 일부분 얻기(2) substr() 함수를 사용하는 방법 [17-31]
C 스타일에서 C++ 스타일로의 변환 C 스타일의 문자열을 C++ 스타일의 문자열로 변환하는 예 실행 결과 char cstyle[] = "Are you a string, too?"; string cppstyle; // 변환한다. cppstyle = cstyle; // cppstyle의 첫번째 글자를 바꿔본다. cppstyle[0] = 'B'; cout << "cstyle = " << cstyle << "\n"; cout << "cppstyle = " << cppstyle << "\n" [17-34]
C++ 스타일에서 C 스타일로의 변환(1) C++ 스타일의 문자열에서 C 스타일의 문자열 주소를 얻는 예 실행 결과 c_str() 함수를 통해서 얻은 문자열의 주소는 const char* 타입이기 때문에, 이 문자열의 내용을 변경하는 것은 불가능하다. string cppstyle = "Yes, I am."; const char* cstyle = NULL; // C 스타일 문자열을 얻는다. cstyle = cppstyle.c_str(); cout << "cstyle = " << cstyle << "\n"; cout << "cppstyle = " << cppstyle << "\n"; [17-35]
C++ 스타일에서 C 스타일로의 변환(2) C++ 스타일의 문자열에서 C 스타일의 문자열로 변환하는 예 실행 결과 string cppstyle = "Yes, I am."; char* cstyle = new char [ cppstyle.size() + 1]; strcpy( cstyle, cppstyle.c_str() ); // cstyle의 첫번째 문자를 바꿔본다. cstyle[0] = 'Z'; cout << "cstyle = " << cstyle << "\n"; cout << "cppstyle = " << cppstyle << "\n"; delete[] cstyle; [17-37]
간단한 문자열의 입력(1) 간단하게 문자열을 입력 받는 예 (문제를 가지고 있다) 실행 결과 char cs[20]; // C 스타일 string cpps; // C++ 스타일 // 문자열을 입력받는다. cin >> cs; cin >> cpps; cout << "cs = " << cs << "\n"; cout << "cpps = " << cpps << "\n"; [17-38]
간단한 문자열의 입력(2) 앞의 예제는 다음의 문제점을 가지고 있다. 준비된 메모리보다 큰 문자열이 입력된 경우 잘못된 메모리 영역을 침범할 수 있다. 공백을 포함한 문자열을 입력받을 수 없다. [17-39] [17-40]
getline() 을 사용한 문자열의 입력(1) 실행 결과 char cs[20]; // C 스타일 string cpps; // C++ 스타일 // 문자열을 입력받는다. cin.getline(cs, 20); cin.clear(); // clear() 함수의 의미는 p.436 참조 getline(cin, cpps); cout << "cs = " << cs << "\n"; cout << "cpps = " << cpps << "\n"; [17-45]
getline() 을 사용한 문자열의 입력(2) getline() 함수를 C++ 스타일의 문자열과 함께 사용하는 방법 getline() 함수를 C 스타일의 문자열과 함께 사용하는 방법 [17-42] [17-43]