컴퓨터프로그래밍 Computer Programming
11 문자와문자열
목차 1. 문자와문자열 2. 문자열관련함수 3. 여러문자열처리 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 3
1. 문자와문자열
문자 영어의알파벳이나한글의한글자를작은따옴표로둘러싸서 A 와같이표기 C 언어에서저장공간크기 1 바이트인자료형 char 로지원 작은따옴표에의해표기된문자를문자상수 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 5
문자열 string 문자의모임인일련의문자 일련의문자앞뒤로큰따옴표로둘러싸서 java 로표기 큰따옴표에의해표기된문자열을문자열상수 A 처럼문자하나도큰따옴표로둘러싸면문자열상수 ABC 처럼작은따옴표로둘러싸도문자가될수없으며오류가발생 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 6
char 형변수에문자를저장 문자열을저장하기위한자료형을따로제공하지않음 문자배열을선언하여각각의원소에문자를저장 문자열의마지막을의미하는 NULL 문자 \0 가마지막에저장 문자열이저장되는배열크기 반드시저장될문자수보다 1이커야널 (NULL) 문자를문자열의마지막으로인식 문자열의마지막에널 (NULL) 문자가없다면출력과같은문자열처리에문제가발생 배열 csharp 의크기를 3 으로선언한후배열 csharp 에문자열 C# 을저장 마지막원소인 csharp[2] 에 \0 을저장 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 7
배열선언시초기화방법 중괄호를사용 문자하나하나를쉼표로구분하여입력하고마지막문자로널 (NULL) 인 \0 을삽입 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 8
배열선언시저장할큰따옴표를사용해문자열상수를바로대입 배열초기화시배열크기는지정하지않는것이더편리 지정한다면마지막문자인 \0 을고려해실제문자수보다 1이더크게배열크기를지정 지정한배열크기가 ( 문자수 +1) 보다크면나머지부분은모두 \0 문자로채워짐 만일배열크기가작으면 문자열상수가아닌단순한문자배열이되므로문자열출력등에서문제가발생 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 9
Source Code #01: chararray.c 함수 printf() 를사용한문자와문자열출력 함수 printf() 형식제어문자 %c 로문자를출력 배열이름또는문자포인터를사용하여형식제어문자 %s 로문자열을출력 함수 puts(csharp) 한줄에문자열을출력한후다음줄에서출력을준비 함수 printf(c) 배열이름을인자로사용해도문자열출력 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 10
문자열을처리하는다른방법 문자열상수를문자포인터에저장하는방식 문자포인터변수에문자열상수를저장 문자열출력도함수 printf() 에서포인터변수와형식제어문자 %s 문자포인터에의한선언으로는문자하나하나의수정은불가능 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 11
Source Code #02: charpointer.c 변수의값과주소값의대입과활용 문자열을구성하는하나하나의문자를배열형식으로직접참조하여출력 변수 java 를사용하여문자를수정하거나수정될수있는함수의인자로사용 실행오류가발생 변수 java 가가리키는문자열은상수이므로수정은불가능 출력할문자열의끝을 \0 문자로검사하면편리 반복문을이용하여문자가 \0 이아니면문자를출력 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 12
Source Code #03: string.c 문자배열로문자열을처리 함수 printf() %s 는문자포인터가가리키는위치에서 NULL 문자까지를하나의문자열로인식 배열 c[] 처음에문자열 C C++ Java 가저장되고마지막에 NULL 문자가저장 만일배열 c 에문장 c[5] = \0 ; 을실행하고 c 를출력하면무엇이출력될까? c[5] 에저장된 \0 문자에의해 c 가가리키는문자열은 C C++ 까지 즉문자열은시작문자부터 \0 문자가나올때까지하나의문자열로처리 (c+6) 로문자열을출력 Java 출력 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 13
\0 문자에의한문자열분리 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 14
함수 getchar() 문자의입력에사용 라인버퍼링 line buffering 방식을사용 문자하나를입력해도반응을보이지않다가 [enter] 키를누르면그제서야이전에입력한문자마다입력이실행 입력한문자는임시저장소인버퍼 (buffer) 에저장되었다가 [enter] 키를만나면함수는버퍼에서문자를읽기시작 즉각적 interactive 인입력을요구하는시스템에서는사용이불가능 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 15
버퍼를사용하지않고문자를입력하는함수 getche() getche() 는버퍼를사용하지않으므로문자하나를입력하면바로함수 getche() 가실행 함수 getche() 에서입력된문자는바로모니터에표시 함수를이용하려면헤더파일 conio.h 를삽입 입력문자가 q 가아니면함수 putchar() 에의하여문자가바로출력 함수 getche() 에의하여입력된문자도보이고바로 putchar() 에의하여출력 입력문자가 inputq 화면에는 iinnppuuttq 표시 화면에보이는행이표준입력과표준출력이번갈아가면서나오게되므로한문자가두번씩표시 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 16
함수 getche() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 17
함수 getch() 문자입력을위한함수 getch() 입력한문자가화면에보이지않는특성 입력된문자를출력함수로따로출력하지않으면입력문자가화면에보이지 (echo) 않음 버퍼를사용하지않는문자입력함수 conio.h 를삽입 위소스에서문자 inputq 를입력으로실행 input 이출력 함수 putch(ch): 인자를출력하는함수 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 18
함수 getch() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 19
함수 getch() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 20
Source Code #04: getche.c 세개의 while 문의입력으로각각 getchar()q, getche()q, getch()q 를입력 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 21
Source Code #05: string.c 함수 scanf() 는공백으로구분되는하나의문자열을입력 함수 scanf( %s, str) 에서형식제어문자 %s 를사용 문자열입력은충분한공간의문자배열이있어야가능 단순히문자포인터로는문자열저장이불가능 가장먼저입력받은문자열이저장될충분한공간인문자배열 str 을선언 함수 printf("%s", str) 에서 %s 를사용하여문자열을출력 이름과성을분리하여입력한다면성만 name[] 에저장 함수 printf() 에서 %10s 는폭이 10, 우측정렬로문자열을출력 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 22
함수 gets(): 한행의문자열입력 헤더파일 stdio.h 를삽입 함수 gets() 는 [enter] 키를누를때까지한행을버퍼에저장한후입력처리 마지막에입력된 \n 가 \0 로교체되어인자인배열에저장 한행을하나의문자열로간주하고프로그래밍할수있도록 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 23
문자열입출력함수 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 24
함수 puts(): 한행에문자열을출력 헤더파일 stdio.h 를삽입 오류가발생하면 EOF를반환 기호상수 EOF(End Of File) 파일의끝이라는의미로 stdio.h 헤더파일에정수 -1로정의 #define EOF (-1) 함수 gets() 와반대로문자열의마지막에저장된 \0 를 \n 로교체하여버퍼에전송 버퍼의내용이모니터에출력되면문자열이한행에출력 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 25
Source Code #06: gets.c 함수 gets() 와 gets_s() 를사용하여여러줄을입력받아출력 while 문을사용하면연속된여러행을입력받아바로행별로출력 다음반복을종료하려면새로운행처음에 (ctrl + Z) 를입력 함수 printf() 와 scanf() 다양한입출력에적합 함수 puts() 와 gets() 처리속도가빠르다는장점 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 26
Lab #01: 한행을표준입력으로받아문자하나하나를그대로출력 함수 gets() 를사용하여한행의표준입력을받아배열 s 에저장한후, 결과 문자포인터를사용해서이배열 s 에서문자하나하나를이동하면서출력 char 변수 p 를선언하면서배열 s 의첫원소를가리키도록저장 포인터변수 p 는주소값이며 *p 는 p 가가리키는곳의문자 int main(void) int main(void) 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 27
2. 문자열관련함수
다양한문자열라이브러리함수 헤더파일 string.h 에함수원형으로선언된라이브러리함수로제공 문자열비교와복사, 그리고문자열연결등과같은다양한문자열처리 문자의배열관련함수 자료형 size_t 비부호정수형 (unsigned int type) 자료형 void * 아직정해지지않은다양한포인터를의미 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 29
Source Code #07: memfun.c 문자열의길이를반환하는함수 strlen() 문자배열의복사를위한함수 memcpy() 문자배열에서문자이후의문자열을찾는함수 memchr() 을알아보는예제 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 30
함수 strcmp() 문자열관련함수는대부분 strxxx() 로명명 문자열비교와복사, 그리고문자열연결등과같은다양한문자열처리 헤더파일 string.h 에함수원형으로선언된라이브러리함수로제공 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 31
Source Code #08: strcmp.c 문자열비교함수 함수 strcmp() 인자인두문자열을사전 (lexicographically) 상의순서로비교하는함수 함수 strncmp() 두문자를비교할문자의최대수를지정하는함수 비교기준은아스키코드값 두문자가같다면계속다음문자를비교하여문자가다를때까지계속비교 비교앞문자가작으면음수, 뒤문자가작으면양수, 같으면 0 을반환 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 32
함수 strcmp() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 33
함수 strcpy() 함수 strcpy() 와 strncpy() 문자열을복사하는함수 함수 strcpy() 는앞인자문자열 dest 에뒤인자문자열 source 를복사 첫번째인자인 dest 는복사결과가저장될수있도록충분한공간을확보 함수 strncpy() 는복사되는최대문자수를마지막인자 maxn 으로지정하는함수 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 34
함수 strcpy() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 35
Source Code #09: strcpy.c 문자열복사사용 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 36
함수 strcpy() 항상문자열은마지막 NULL 문자까지포함하므로다음부분소스에서문자배열 d 에는 NULL 문자까지복사 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 37
함수 strcpy() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 38
함수 strcpy() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 39
Source Code #10: strcat.c 문자열연결함수사용 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 40
함수 strcat() 함수 strcpy() 와 strcat() 를이용시 첫인자로문자열포인터변수는사용불가능 첫번째인자인 dest 는복사또는연결결과가저장될수있도록충분한공간을확보 문자열관련함수에서단순히문자열포인터를수정이가능한문자열의인자로사용불가능 다음은모두오류발생 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 41
함수 strtok() 문자열에서구분자 (delimiter) 인문자를여러개지정하여토큰을추출하는함수 첫번째인자인 str은토큰을추출할대상인문자열 두번째인자인 delim 은구분자로문자의모임인문자열 첫번째인자인 str은문자배열에저장된문자열을사용 str은문자열상수를사용불가능 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 42
함수 strtok() 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 43
Source Code #11: strtok.c 문자열분리함수사용 문장 ptoken = strtok(str, delimiter); 으로첫토큰을추출 결과를저장한 ptoken 이 NULL 이면더이상분리할토큰이없는경우 계속토큰을추출하려면 while 반복으로추출된토큰이있는지를 (ptoken!= NULL) 로검사 NULL 을첫번째인자로다시 strtok(null, delimiter) 를호출하면그다음토큰을반환 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 44
문자열의길이와위치검색 함수 strlen() NULL 문자를제외한문자열길이를반환하는함수 함수 strlwr() 인자를모두소문자로변환하여반환 함수 strupr() 인자를모두대소문자로변환하여반환 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 45
다양한문자열관련함수 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 46
Lab #02: 문자열을역순으로저장하는함수 reverse() 구현 함수 memcpy() 를사용 문자열상수를배열에저장하여출력한후, 함수 reverse() 를호출 문자열을역순으로저장한후그결과를출력 문자열배열을역순으로저장하는함수 char 일차원배열 s[50] 를선언하여함수 memcpy() 로문자열 C Programming! 을저장 함수 reverse(char str[]) 는문자열 str 을역순으로다시저장 다음결과와같이원문자열과역순문자열을출력 C Programming!!gnimmargorP C 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 47
3. 여러문자열처리
문자포인터배열 문자포인터배열을이용하는방법 여러개의문자열을처리하는하나의방법 하나의문자포인터가하나의문자열을참조가능 문자포인터배열은여러개의문자열을참조가능 장단점 문자포인터배열이용방법은각각의문자열저장을위한최적의공간을사용 문자포인터를사용해서는문자열상수의수정은불가능 문장 pa[0][2] = v ; 와같이문자열의수정은실행오류가발생 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 49
문자포인터배열 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 50
이차원문자배열 여러개의문자열을처리하는다른방법 문자의이차원배열을이용하는방법 이차원배열의열크기는문자열중에서가장긴문자열의길이보다 1 크게지정 가장긴문자열 "java" 보다 1 이큰 5 를 2 차원배열의열크기로지정 물론이차원배열의행의크기는문자열수 장단점 3 으로지정하거나공백으로비워둠 문자의이차원배열에서모든열수가동일하게메모리에할당 열의길이가서로다른경우에는 \0 문자가들어가낭비 문자열을수정가능 ca[0][2] = v ; 와같이원하는문자수정이가능 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 51
이차원문자배열 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 52
Source Code #12: strarray.c 문자포인터배열과이차원문자배열 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 53
명령행인자 main(int argc, char *argv[]) 프로그램 dir 를개발한다면옵션에해당하는 /w 를어떻게인식할까? 명령행인자 command line arguments 를사용하는방법 명령행에서입력하는문자열을프로그램으로전달하는방법 프로그램에서명령행인자를받으려면 두개의인자 argc 와 argv 를 (int argc, char * argv[]) 로기술 매개변수 argc 는명령행에서입력한문자열의수 argv[] 는명령행에서입력한문자열을전달받는문자포인터배열 실행프로그램이름도하나의명령행인자에포함 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 54
명령행인자실행샘플 명령행에서실행파일의이름이 commandarg 옵션으로 C# C++ Java: 프로그램을실행한결과 명령행인자로프로그램을실행하면다음과같은구조의문자열이전달 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 55
Source Code #13: commandarg.c 인자 argc, argv 활용 다음은위프로그램을도스창에서실행한결과 도스창에서실행한경우, 실행결과의첫인자값이실행파일이름 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 56
Lab #03: 여러문자열을배열에저장한후출력 문자포인터배열 pstr 을선언 문자배열이름을초기화로저장 변수 str1, str2, str3 와 pstr 을사용 저장된문자열과문자, 적절히출력 str1, str2, str3 을선언하면서문자열 JAVA, C#, C++ 를저장 pstr 을선언하면서문자열포인터인 str1, str2, str3 을저장 다음과같이문자열과문자를출력 JAVA C# C++ J # + A # + 컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 57
컴퓨터프로그래밍 (Computer Programming) - 11 문자와문자열 58