문자열 처리하기 working with Strings Chapter 1 문자열 처리하기 working with Strings
Example 1 이름을 입력 받아서 인사하는 C++ 프로그램으로 확장 // ask for a person's name, and greet the person #include <iostream> #include <string> int main() { // ask for the person's name std::cout << "Please enter your first name: "; // read the name std::string name; // define `name' std::cin >> name; // read into `name' // write a greeting std::cout << "Hello, " << name << "!" << std::endl; return 0; }
변수(variable) 변수는 이름(name)을 갖는 객체(object)이다. std::string name; // name을 정의(definition) 변수의 이름: name 변수의 타입: std::string 변수는 이름(name)을 갖는 객체(object)이다. 객체는 타입(type)을 갖는 컴퓨터 메모리의 일부를 말함 객체의 타입에 내포되어 있는 인터페이스(interface) 해당 타입의 객체에 사용 가능한 연산(operation)들의 집합 즉, name은 string 타입이 제공하는 모든 일을 할 수 있음: 문자열 연결, 문자열 길이계산, 널 문자로 초기화 등 string이라는 표준라이브러리와 관련된 헤더는 <string> 따라서, #include <string> 필요 name은 main()함수 내에서만 유효한 지역 변수(local variable) 즉, main() 함수가 시작할 때 생성되고, 끝날 때 소멸됨 int k; + - * / <
읽어 들이기: cin 입력 연산자(input operator) >> std::cin >> name; // read into name 표준입력 std::cin에서 string을 읽어서 그 내용을 name이라는 객체에 저장 처음 나오는 공백문자(space, tab, backspace, newline)는 버림 그 다음 공백 문자 또는 파일의 끝(end-of-file)까지 문자를 읽음 std::cin 은 표준 입력 스트림(standard input stream) 버퍼(buffer) 입출력 효율을 위해 버퍼 사용: 버퍼에 모아두었다가 처리 버퍼를 플러쉬(flush)함 버퍼가 꽉 찰 때까지 기다리지 않고 그 내용을 출력장치에 씀
Example 2. 이름에 테두리 만들기 장식해 보자. (검정은 프로그램의 출력, 녹색은 키보드 입력) Please enter your first name: Estragon ******************** * * * Hello, Estragon! * John이 들어오면? Alexandricus가 들어오면? 문자열의 길이를 알아내고, 그에 따라 폭을 계산하고, 폭에 맞추어 출력하는 절차를 밟아야 한다.
// ask for a person's name, and generate a framed greeting #include <iostream> #include <string> int main() { std::cout << "Please enter your first name: "; std::string name; std::cin >> name; // build the message that we intend to write const std::string greeting = "Hello, " + name + "!"; // build the second and fourth lines of the output const std::string spaces(greeting.size(), ' '); const std::string second = "* " + spaces + " *"; // build the first and fifth lines of the output const std::string first(second.size(), '*'); // write it all std::cout << std::endl; std::cout << first << std::endl; std::cout << second << std::endl; std::cout << "* " << greeting << " *" << std::endl; return 0; }
세 가지 새로운 개념 const std::string greeting = “Hello, ” + name + “!”; = 연산자를 사용한 변수 값의 초기화(initialize) greeting 변수를 정의하며 greeting 값을 초기화 할 수 있다 + 연산자를 사용하여 문자열을 결합(concatenate) string변수+ string변수 // OK name1+name2 string변수+ 문자열 리터럴 // OK name+”abc” 문자열 리터럴 + string변수 // OK “abc”+name 문자열 리터럴 + 문자열 리터럴 // ERROR! “abc”+”xyz” const를 사용하여 변수 값을 상수(constant)로 고정시킴 const 사용하면, 변수 정의할 때 반드시 초기화 어떤 이점이 있지?
연산자 오버로딩(operator overloading) 연산자 + int i1 = 12, i2 = 34; i1 + i2; // produces 46, not 1234 std::string s1 = "hel", s2 = "lo"; s1 + s2; // produces "hello“ 연산자 << 와 >> char c; int i; float f; std::cin >> c; std::cin >> i; std::cin >> f; C언어에서 모든 산술 연산자도 오버로드 된 것임 int i1 = 10, i2 = 20, i3; float f1 = 1.0, f2 = 2.0, f3; double d1 = 1.00, d2 = 2.00, d3; i3 = i1 + i2; f3 = f1 + f2; d3 = d1 + d2; std::cout << c; std::cout << i; std::cout << f;
멤버함수에 의한 초기화 const std::string spaces(greeting.size(), ‘ ’); const std::string first(second.size(), ‘*’); string 타입은 size()라는 멤버 함수(member function)를 제공 greeting.size()는 객체의 문자열 길이를 넘겨 줌 변수의 타입에 따라 표현식으로부터 변수를 구성 (construct) 예를 들어, std::string spaces(10, ‘*’ ); stars라는 객체는 “**********”을 갖게 된다. spaces(greeting.size(), ‘ ’); spaces라는 객체는 greeting.size() 개 만큼 공백문자(‘ ’)를 갖는 문자열로 초기화된다. first(second.size(), ‘*’);
문자열 연습문제 1. 스트링 변수 a, b, c의 값은 무엇인가? for the input: std::string a, b, c; std::cin >> a >> b >> c; 2. 두 개의 문자열을 입력 받아서, 짧은 길이를 갖는 문자열을 출력하라. 또한, 두 개의 문자열을 결합해서 출력하라. for the input: all-cows eat123 grass. Every good boy deserves fudge!
문자열 연산자 첨자 연산자(subscript operator) [] 두 개의 문자열을 비교하는 연산자 스트링의 각 문자를 접근할 때 사용 첫번째 문자는 첨자 0 부터 시작함 For example, given std::string a = "Susan"; Then a[0] == ’S’ and a[1] == ’u’ and a[4] == ’n’. 두 개의 문자열을 비교하는 연산자 string1 == string2 string1 != string2