SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 9. 스트링 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
Learning Objectives 스트링을위한배열형식 C- 스트링 문자조작도구 문자 I/O get, put 멤버함수 putback, peek, ignore 표준스트링클래스 스트링프로세스 9-2
개요 두개의스트링형식 : C-스트링 문자형배열 배열의끝을마킹 null, "\0" C언어에서기인된전통적인방법 스트링클래스 템플릿사용 9-3
C- 스트링 문자형배열 인덱스변수당하나의문자 extra character: "\0" 널문자 문자열의끝을표시 : 종료표시자 (End Marker) C 언어부터사용해오던방식 Hello : C- 스트링으로저장된문자상수 9-4
C- 스트링변수 문자형배열 : char s[10]; 9 개문자를위한 C- 스트링변수선언 널문자추가됨 일반적으로부분적으로채워진배열 최대스트링크기를여유있게선언 스트링의끝은널문자로마킹 일반배열과다른점 : 반드시널문자를포함해야함 9-5
C- 스트링저장 char s[10]; "Hi Mom!" 의저장 : 9-6
C- 스트링초기화 C- 스트링초기화 : char mymessage[20] = "Hi there."; 모든배열요소를채울필요없음 배열의마지막에 "\0" 위치 배열의크기를명시하지않을경우 : char shortstring[] = "abc"; 자동으로문자열보다하나큰크기로설정됨 다음의예와다름 : char shortstring*+ =, a, b, c -; 9-7
C- 스트링은배열 C- 스트링인덱스 인덱스변수로접근이가능 : char ourstring[5] = "Hi"; ourstring[0] "H" ourstring[1] "i" ourstring[2] "\0" ourstring[3] unknown ourstring[4] unknown 9-8
C- 스트링인덱스조작 인덱스변수단위의조작이가능 char happystring[7] = "DoBeDo"; happystring[6] = "Z"; 주의! 여기서, \0 (null) 이 Z 로대치됨 널문자가유지되지못하면더이상 C- 스트링으로동작하지않음! 예상치못한결과! 9-9
라이브러리 C- 스트링선언 C++ 라이브러리가필요없음 표준 C++ 에 Built in 되어있음 조작 <cstring> 라이브러리필요 #include <cstring> 전역네임스페이스에정의되어있다 - 별도의 using 문장이필요없다. 9-10
C- 스트링의할당 (=) 과비교 (==) C- 스트링은다른변수와다름 할당과비교연산이불가 : char astring[10]; astring = "Hello"; // ILLEGAL! C- 스트링선언할때 = 사용가능! : 변수의초기화구문 할당을위해라이브러리함수를사용해야함 : strcpy(astring, "Hello"); <cstring> 의라이브러리함수 astring 에 "Hello 가할당 크기체크하지않음! 다른배열과마찬가지로프로그래머의몫! strcpy 함수의세번째인자로복사되는문자열의크기지정. 9-11
C- 스트링의비교 == 연산자사용불가 char astring[10] = "Hello"; char anotherstring[10] = "Goodbye"; astring == anotherstring; // NOT allowed! 라이브러리함수를사용해야함 : if (strcmp(astring, anotherstring)) cout << "Strings NOT same."; //true else cout << "Strings are same."; //false 9-12
<cstring> 라이브러리 : 디스플레이 9.1 <cstring> 에서사전정의된 C- 스트링함수 (1/2) Full of string manipulation functions 9-13
<cstring> 라이브러리 : 디스플레이 9.1 <cstring> 에서사전정의된 C- 스트링함수 (2/2) 4-14
C- 스트링함수 : strlen() 스트링의길이를리턴 : char mystring[10] = "dobedo"; cout << strlen(mystring); 문자의수를리턴함 널문자는포함되지않음 결과 6 9-15
C- 스트링함수 : strcat() strcat() 스트링연결 : char stringvar[20] = "The rain"; strcat(stringvar, "in Spain"); 결과 : "The rainin Spain" 주의! 문자열을모두수용할수있는공간이필요! 9-16
C- 스트링인자와매개변수 C- 스트링은배열 따라서, C- 스트링매개변수는배열매개변수와동일 함수에전달된 C- 스트링은함수에서수정이가능! 다른배열과동일하게일반적으로배열크기전달 마지막을찾기위해함수내부에서널문자이용 함수내부에서 C- 스트링매개변수의변경이없다면크기는필요없음 C- 스트링매개변수보호 const 9-17
C- 스트링출력 << 이용 이미사용 : cout << news << " Wow.\n"; 여기서 news 는 C- 스트링변수 가능한이유 << 는이미 C- 스트링을위해오버로딩되어있음! 9-18
>> 이용 이슈가존재 C- 스트링입력 공백문자 delimiter( 구획문자 ) Tab, space, line break Delimiter 에서읽기중단 C- 스트링크기주의 스트링을위해충분한공간을확보해야함! C++ 에서공간에대한경고가없음! 9-19
C- 스트링입력예제 char a[80], b[80]; cout << "Enter input: "; cin >> a >> b; cout << a << b << "END OF OUTPUT\n"; 실행결과 : Enter input: Do be do to you! DobeEND OF OUTPUT C- 스트링 a Do" C- 스트링 b be" 9-20
C- 스트링라인입력 C- 스트링에라인단위의입력이가능 getline() 사용, 사전정의된멤버함수 : char a[80]; cout << "Enter input: "; cin.getline(a, 80); cout << a << "END OF OUTPUT\n"; 실행결과 : Enter input: Do be do to you! Do be do to you!end OF INPUT 9-21
예 : 명령행인자 명령행으로부터실행되는프로그램들 (UNIX shell, DOS 명령프롬프트 ) 은인자를보낼수있다 예 : COPY C:\FOO.TXT D:\FOO2.TXT COPY 라는이름의프로그램을실행하고 2 개의 C- 스트링매개변수를보낸다 : C:\FOO.TXT and D:\FOO2.TXT 제공되는입력에따라 COPY 프로그램을수행한다. 인자들은 C- 스트링의배열로서 main 함수에전달된다 9-22
예 : 명령행인자 main 함수의헤더 int main(int argc, char *argv[]) 인자 argc 는주어진인자의개수를명시하는정수이며, 기본적으로프로그램의이름을하나의수로간주하기때문에 argc 값은최소한 1 이된다 인자 argv 는 C- 스트링의배열 argv[0] 는프로그램의이름을명시 argv[1] 은첫번째매개변수를명시 argv[2] 는두번째매개변수를명시 9-23
예 : 명령행인자 // Echo back the input arguments int main(int argc, char *argv[]) { for (int i=0; i<argc; i++) { cout << "Argument " << i << " " << argv[i] << endl; } return 0; } 예제실행 > Test Argument 0 Test 명령프롬프트로부터의입력테스트 예제실행 > Test hello world Argument 0 Test Argument 1 hello Argument 2 world 9-24
getline() 멤버함수 명시적인입력크기지정가능 : char shortstring[5]; cout << "Enter input: "; cin.getline(shortstring, 5); cout << shortstring << "END OF OUTPUT\n"; 결과 : Enter input: dobedowap dobeend OF OUTPUT 네개의문자만을읽음 하나는널문자를위한공간! 9-25
문자 I/O 입 / 출력데이터 모두문자로취급 예 ) 숫자 10 은 1 과 0 두개의문자가출력된것 변환은자동으로수행 저수준도구사용 C++ 에서는하드웨어수준의저수준도구의사용이가능 9-26
get() 멤버함수 한번에하나의문자를읽음 cin 객체의멤버함수 : char nextsymbol; cin.get(nextsymbol); 키보드에서입력된문자를 nextsymbol 변수에저장 매개변수는반드시문자형 문자열이아님! 9-27
put() 멤버함수 한번에하나의문자를출력 cout 객체의멤버함수 : 예 : cout.put( a ); 문자 a 를출력 char mystring[10] = "Hello"; cout.put(mystring[1]); 문자 e 를출력 9-28
기타멤버함수 putback() 읽어온문자를되돌림 cin.putback(lastchar); peek() 입력될다음문자를리턴 peekchar = cin.peek(); ignore() 지정된문자의입력생략 cin.ignore(1000, \n ); 최대 1000 개의문자까지 \n 생략 9-29
문자조작함수 : 디스플레이 9.3 <cctype> 일부함수 (1/3) 4-30
문자조작함수 : 디스플레이 9.3 <cctype> 일부함수 (2/3) 4-31
문자조작함수 : 디스플레이 9.3 <cctype> 일부함수 (3/3) 4-32
표준스트링클래스 라이브러리에정의되어있음 : #include <string> using namespace std; 문자열변수와표현 기본형과유사하게취급됨 할당, 비교, 결합이가능 : string s1, s2, s3; s3 = s1 + s2; //Concatenation s3 = "Hello Mom!" //Assignment C-스트링 "Hello Mom!" 은자동으로스트링형으로변환됨! 9-33
디스플레이 9.4 스트링클래스프로그램 4-34
스트링클래스 I/O 다른형과동일함! string s1, s2; cin >> s1; cin >> s2; 입력 : May the hair on your toes grow long and curly! 공백문자이후무시 : s1 "May" s2 "the" 9-35
클래스스트링과 getline() 라인단위입력을위해 : string line; cout << "Enter a line of input: "; getline(cin, line); cout << line << "END OF OUTPUT"; 실행결과 : Enter a line of input: Do be do to you! Do be do to you!end OF INPUT C- 스트링의 getline() 사용과유사 9-36
getline() 함수의다른버전 Delimiter 문자설정 : string line; cout << "Enter input: "; getline(cin, line,? );? 문자까지입력 getline() 은참조를리턴 string s1, s2; getline(cin, s1) >> s2; 결과 : cin >> s2; 9-37
함정 : 혼합입력 cin >> var 과 getline 의혼용에유의 int n; string line; cin >> n; getline(cin, line); 입력 : 42 Hello hitchhiker. 변수 n 은 42 로세팅됨 line 은빈문자열로세팅! cin >> n 은 \n 에서읽기를멈춤, \n 이 getline() 에입력됨! 9-38
스트링클래스를이용한스트링처리 C- 스트링과같은오퍼레이션이가능 향상된버전! 표준스트링클래스의멤버함수는 100 개이상이존재 일부멤버함수 :.length() 스트링변수의길이를리턴.at(i) i 번째문자의참조를리턴 9-39
디스플레이 9.7 표준스트링클래스의 멤버함수 (1/2) 4-40
디스플레이 9.7 표준스트링클래스의 멤버함수 (2/2) 4-41
C- 스트링과스트링객체의변환 자동형변환 C- 스트링 스트링객체 : char acstring[] = "My C-string"; string stringvar; stringvar = acstring; 완벽하게허용되고적절한방법이다! 스트링객체 C- 스트링 acstring = stringvar; 변환이지원되지않음! 명시적인변환방법을사용 : strcpy(acstring, stringvar.c_str()); 9-42
요약 C- 스트링변수는문자배열 널문자 ( \0 ) 추가됨 C- 스트링은배열과동일하게동작 할당, 비교연산수행불가 <cctype> 과 <string> 라이브러리에는유용한문자열조작함수가존재 cin.get() 함수는하나의문자를읽음 getline() 함수는라인단위의입력이가능 스트링클래스는 C- 스트링보다향상되고편리함 9-43
Q&A 4-44