C Programming 문자와문자열 (Characters and Strings) Seo, Doo-Ok Clickseo.com clickseo@gmail.com
목 차 문자처리 문자열처리 2
문자처리 문자처리 문자분류함수 문자변환함수 문자열처리 3
문자분류함수 (1/3) 문자분류 (Character classification) 함수 : 영문대소문자 영문대소문자로분류되는문자인지여부를확인하는함수 변환대상문자는unsigned char 로표현될수없다. EOF와같지않은경우의동작은정의되지않는다. #include <ctype.h> 판단하려는문자인경우 : 0 이외의값을반환판단하려는문자가아닌경우 : 0 값을반환 int islower( int ch ); int isupper( int ch ); // 영문소문자여부판단 // 영문대문자여부판단 int isalpha( int ch ); // 영문대소문자여부판단 4
문자분류함수 : 숫자 문자분류함수 (2/3) 숫자로분류되는문자인지여부를확인하는함수 변환대상문자는unsigned char 로표현될수없다. EOF와같지않은경우의동작은정의되지않는다. #include <ctype.h> int isdigit( int ch ); int isxdigit( int ch ); 판단하려는문자인경우 : 0 이외의값을반환판단하려는문자가아닌경우 : 0 값을반환 //10진수숫자문자여부판단 //16진수숫자문자여부판단 int isalnum( int ch ); // 영문대소문자와숫자여부판단 5
문자분류함수 (3/3) 문자분류함수 : 다양한문자 공백과제어문자그리고그래픽문자등다양한문자에대하여분류되는문자인지여부를확인하는함수 변환대상문자는unsigned char 로표현될수없다. EOF와같지않은경우의동작은정의되지않는다. #include <ctype.h> 판단하려는문자인경우 : 0 이외의값을반환 판단하려는문자가아닌경우 : 0 값을반환 int isblank( int ch ); int isspace( int ch ); //, t //, t, n, r, f, v int iscntrl( int ch ); int isgraph( int ch ); // 제어문자여부판단 // 그래픽문자여부판단 int isprint( int ch ); int ispunct( int ch ); // 주어진문자가인쇄될수있는지판단 // 구두문자 (punctuation character) 판단 6
문자변환함수 (1/2) 문자조작함수 : 영문대소문자 영문대문자롤소문자로또는영문소문자를대문자로변환 변환대상문자는unsigned char 로표현될수없다. EOF와같지않은경우의동작은정의되지않는다. #include <ctype.h> 대소문자변환성공 : 변환된문자 ch 값 (ASCII code) 반환대소문자변환실패 : 기존문자 ch 값 (ASCII code) 반환 int tolower( int ch ); int toupper( int ch ); // 주어진문자 ch 를소문자로변환 // 주어진문자 ch 를대문자로변환 7
예제 6-1 : 문자분류및변환함수 문자변환함수 (2/2) #include <stdio.h> #include <ctype.h> // islower, isupper, tolower, toupper int main(void) { char char str[] = "Hi~Clickseo"; *pstr = str; fputs(" 원본문자열 : ", stdout); puts(str); printf(" 변환문자열 : "); for (; *pstr!= '\0'; pstr++) { if ( islower(*pstr) ) putchar( toupper(*pstr) ); else if ( isupper(*pstr) ) putchar( tolower(*pstr) ); else putchar( *pstr ); } putchar('\n'); } return 0; 8
문자열처리 문자처리 문자열처리 문자열조작함수 문자열검사함수 문자열과숫자변환함수 9
문자열처리 (1/2) 문자열처리 (String Handling) : string.h C 표준라이브러리 : <string.h> 널문자를제외한문자개수를검증하는과정 size_t mystrlen( const char *pstr ) { if (pstr == NULL) // 잘못된문자열 { return 0; } int count = 0; while ( *pstr++ ) count++; } return count; size_t strlen ( const char *str ); 10
문자열처리 (2/2) 문자열처리 : 데이터유형과매크로상수 데이터유형 typedef unsigned int size_t; typedef unsigned short wchar_t; 매크로상수 #define NULL ((void *) 0) 11
문자열조작함수 (1/4) 문자열복사함수 : strcpy, strncpy 널문자를포함한원본문자열을대상문자열로복사 단, strnpy 함수는주어진문자개수만을복사한다. char *strcpy ( char *dest, const char *src ); char *strcpy ( char *restrict dest, const char *restrict src ); // until C99 // since C99 char *strncpy ( char *dest, const char *src, size_t ount ); // until C99 char *strncpy ( char *restrict dest, const char *restrict src, size_t count ); // since C99 원본문자열의길이가대상문자열이할당받은메모리크기보다긴경우 할당된메모리상에서목적지문자열뒤에있는데이터가파괴된다. 원본문자열보다목적지문자열이항상더크게메모리공간을할당해주어야한다. 12
문자열조작함수 (2/4) 예제 6-2 : 문자열복사함수 - strcpy, strncpy #include <stdio.h> // strcpy, strncpy int main(void) { char dest[48] = { '\0 }; char src[48] = "Hi~ Clickseo"; printf(" 원본문자열 (dest) : %s \n", dest ); printf(" 원본문자열 (src) : %s \n\n", src ); strcpy( dest, src ); printf("strcpy(dest, src) \n"); printf(" 대상문자열 (dest) : %s \n\n", dest ); char temp[] = "1234567890"; strncpy( dest, temp, 4 ); printf("strncpy(dest, temp, 5) \n"); printf(" 대상문자열 (dest) : %s \n", dest ); } return 0; 13
문자열조작함수 (3/4) 문자열추가함수 : strcat, strncat 대상문자열에원본문자열을추가한다. char *strcat ( char *dest, const char *src ); char *strcat ( char *restrict dest, const char *restrict src ); // until C99 // since C99 char *strncat ( char *dest, const char *src, size_t count ); // until C99 char *strncat ( char * restrict dest, const char * restrict src, size_t count ); // since C99 14
문자열조작함수 (4/4) 예제 6-3 : 문자열추가함수 - strcat, strncat #include <stdio.h> // strcat, strncat int main(void) { char dest[48] = "Hi~ "; char src[48] = "Clickseo"; printf(" 원본문자열 (dest) : %s \n", dest ); printf(" 원본문자열 (src) : %s \n\n", src ); strcat( dest, src ); printf("strcat(dest, src) \n"); printf(" 대상문자열 (dest) : %s \n\n", dest ); char temp[] = "1234567890"; strncat( dest, temp, 4 ); printf("strncpy(dest, temp, 5) \n"); printf(" 대상문자열 (dest) : %s \n", dest ); } return 0; 15
문자열검사함수 (1/13) 문자열길이검사함수 : strlen 주어진문자열의길이 ( 문자개수 ) 를검사한다. size_t strlen ( const char *str ); size_t strnlen_s ( const char *str, size_t size ); // since C11 char str[] = "Hi~ Clickseo"; printf(" 문자열길이 : %d \n", strlen(str) ); printf(" 배열크기 : %d \n\n", sizeof(str) ); char temp[1024]; printf(" 문자열길이 : %d \n", strlen(temp) ); printf(" 문자열길이 : %d \n", strnlen_s(temp, sizeof(temp)) ); 16
문자열검사함수 (2/13) 문자열비교함수 : strcmp, strncmp 주어진두개의문자열이동일한지여부를비교한다. int strcmp ( const char *left, const char *right ); int strncmp ( const char *left, const char *right, size_t count ); 두문자열이동일한경우 : 0 값을반환 두문자열이동일하지않은경우 사전순으로왼쪽문자가더큰 ASCII 값인경우 : 1 사전순으로오른쪽문자가더큰 ASCII 값인경우 : -1 17
문자열검사함수 (3/13) 예제 6-4 : 문자열검사함수 - strcmp #include <stdio.h> // strcmp, strncmp int main(void) { char char lstr[] = "Hi~ Clickseo"; rstr[] = "Hi~ Clickseo"; printf(" 왼쪽문자열 : %s \n", lstr); printf(" 오른쪽문자열 : %s \n\n", rstr); int res = strcmp( lstr, rstr ); if (res == 0) else printf(" 동일한문자열 \n"); printf(" 서로다른문자열 \n"); printf("strcmp(\"abc\", \"DEF\") : %d\n", strcmp( "abc", "DEF" ) ); printf("strcmp(\"abc\", \"def\") : %d\n\n", strcmp( "ABC", "def" ) ); printf("strcmp(\" 김가야 \", \" 서가야 \") : %d\n", strcmp( " 김가야 ", " 서가야 " ) ); printf("strcmp(\" 서가야 \", \" 김가야 \") : %d\n", strcmp( " 서가야 ", " 김가야 " ) ); } return 0; 18
문자열검사함수 (4/13) 예제 6-5 : 문자열검사함수 - strncmp #include <stdio.h> // strcmp, strncmp int main(void) { char char lstr[] = "Hi~ Clickseo"; rstr[] = "Hi~ Click"; printf(" 왼쪽문자열 : %s \n", lstr ); printf(" 오른쪽문자열 : %s \n\n", rstr ); int res = strncmp( lstr, rstr, 3 ); printf("strncmp(lstr, rstr, 3) : %d \n", res ); res = strncmp( lstr, rstr, 10 ); printf("strncmp(lstr, rstr, 10) : %d \n", res ); res = strncmp( lstr, rstr, 50 ); printf("strncmp(lstr, rstr, 10) : %d \n", res ); } return 0; 19
문자열검사함수 (5/13) 문자또는문자열검색함수 : strchr, strrchr, strstr 문자열에서지정된문자또는문자열이존재하는지검색한다. // 문자열에지정된문자가존재하는지검색하는함수 char *strchr ( const char *str, int ch ); char *strrchr ( const char *str, int ch ); // 문자열에서부분문자열이존재하는지검색하는함수 char *strstr ( const char *str, const char *substr ); strchr : 문자열의처음부터처음으로일치하는문자를검색 strrchr : 문자열의끝에서부터일치하는문자를검색 문자열에서문자 ( 또는문자열 ) 가존재하는지검색한다. 지정된문자 ( 또는문자열 ) 이존재 : 검색된문자 ( 또는문자열 ) 의메모리주소반환 지정된문자 ( 또는문자열 ) 존재하지않음 : NULL 반환 20
문자열검사함수 (6/13) 예제 6-6 : 문자또는문자열검색함수 - strchr #include <stdio.h> // strchr int main(void) { char str[] = "Hi~ Clickseo"; printf(" 원본문자열 : %s \n\n", str ); printf(" 검색할문자 : "); char ch = getchar(); char *pchar = strchr( str, ch ); if ( pchar == NULL ) printf(" 존재하지않는문자!!! \n"); else printf(" 검색문자 : %c \n", *pchar ); } return 0; 21
문자열검사함수 (7/13) 예제 6-7 : 문자또는문자열검색함수 - strstr #include <stdio.h> // strstr int main(void) { char char str[] = "Hi~ Clickseo"; search[24]; printf(" 원본문자열 : %s \n\n", str ); printf(" 검색할문자열 : "); gets(search); char *pstr = strstr( str, search ); if ( pstr == NULL ) printf(" 존재하지않는문자열!!! \n"); else printf(" 검색문자열 : %s \n", pstr ); } return 0; 22
문자열검사함수 (8/13) 특정문자가연속해서존재하는지검사하는함수 size_t strspn( const char *dest, const char *src ); size_t strcspn( const char *dest, const char *src ); 문자열에서특정문자가첫번째문자부터연속해서존재하는길이를검색한다. 특정문자가연속해서존재 : 검색된부분의길이를반환 특정문자가연속해서존재하지않음 : 0 값을반환 strspn 함수 대상문자열을구성하는문자가원본문자열에연속적으로존재하는지길이를구하는함수 ( 단, 순서는중요하지않다 ) strcspn 함수 대상문자열을구성하는문자가원본문자열에연속적으로존재하지않는길이를구하는함수 ( 단, 순서는중요하지않다 ) 23
문자열검사함수 (9/13) 예제 6-8 : 특정문자가연속해서존재하는지검사하는함수 - strspn #include <stdio.h> // strspn, strcspn int main(void) { char dest[] = "Hello World!!!"; char src1[] = "abcdeabcdeh"; char src2[] = "abcdeabcde"; int res = strspn( dest, src1 ); printf("strspn(dest, src1) : %d \n", res ); res = strspn( dest, src2 ); printf("strspn(dest, src2) : %d \n", res ); res = strcspn( dest, src1 ); printf("strspn(dest, src1) : %d \n", res ); res = strcspn( dest, src2 ); printf("strspn(dest, src1) : %d \n", res ); } return 0; 24
문자열검사함수 (10/13) 특정문자가존재하는지검사하는함수 char *strpbrk( const char *dest, const char *breakset ); 문자열에서여러개의문자중하나라도존재하는지 특정문자가존재 : 검색된문자의메모리주소를반환 특정문자가존재하지않음 : NULL 반환 strpbrk 함수 특정문자열에서여러개의문자중하나라도있는지를검색하는함수 대상문자열의문자가하나라도존재하는위치에서검색을중단한다.» 검색된문자의메모리주소를반환한다. 25
문자열검사함수 (11/13) 예제 6-9 : 특정문자가존재하는지검사하는함수 - strpbrk #include <stdio.h> // strpbrk int main(void) { char char char dest[] = "Hi~ Clickseo"; breakset[] = "abcde"; *paddr = NULL; printf(" 대상문자열 : %s \n", dest ); printf(" 검색문자들 : %s \n\n", breakset ); paddr = strpbrk( dest, breakset ); if ( paddr!= NULL ) printf("paddr : %p, %c, %s \n", paddr, *paddr, paddr ); } return 0; 26
문자열검사함수 (12/13) 문자열분할함수 : strtok char *strtok( char *str, const char *token ); // until C99 char *strtok( char *restrict str, const char *restrict token ); // since C11 대상문자열을지정된특정구분자로문자열을분할한다. 특정구분자가존재 : 검색된 token 의위치 ( 메모리주소 ) 를반환 특정구분자가존재하지않음 : NULL 반환 strtok 함수 원하는구분자를이용하여문자열을쪼갤수있도록하는함수 문자열을분할할때의구분자는두번째인자로지정한다. 27
문자열검사함수 (13/13) 예제 6-10 : 문자열분할함수 - strtok #include <stdio.h> // strtok int main(void) { char str[] = " 서두옥 70 80 90 240 80.0"; char *ptoken = NULL; printf("str : %p %s \n\n", str, str ); ptoken = strtok( str, " " ); while ( ptoken!= NULL ) { printf("%p : %s \n", ptoken, ptoken ); ptoken = strtok( NULL, " " ); } } return 0; 28
문자열과숫자변환함수 (1/4) 문자열을숫자로변환하는함수 : atoi, atof 문자열을숫자 ( 정수형또는실수형 ) 로변환 #include <stdlib.h> // 문자열을정수형 (int, long, long long) 으로변환하는함수 int atoi ( const char *str ); long atol ( const char *str ); long long atoll ( const char *str ); // since C99 // 문자열을실수형 (double) 으로변환하는함수 double atof ( const char *str ); 29
문자열과숫자변환함수 (2/4) 예제 6-11 : 문자열을숫자로변환하는함수 - atoi, atof #include <stdio.h> #include <stdlib.h> // atoi, atof int main(void) { char str[24]; printf(" 임의의숫자입력 : "); gets(str); printf("\n입력문자열 : %s \n", str ); printf(" 변환된정수 : %d \n", atoi(str) ); printf(" 변환된실수 : %lf \n", atof(str) ); } return 0; 30
문자열과숫자변환함수 (3/4) 숫자를문자열로변환하는함수 : itoa, ltoa 정수형숫자를 2 진수, 8 진수, 10 진수또는 16 진수의문자열로변환 #include <stdlib.h> // 정수형 (int) 숫자를문자열 str 로변환 char *itoa ( int value, char *str, int radix ); // 정수형 (long) 숫자를문자열 str 로변환 char *ltoa ( long value, char *str, int radix ); 31
문자열과숫자변환함수 (4/4) 예제 6-12 : 숫자를문자열로변환하는함수 - itoa #include <stdio.h> #include <stdlib.h> // itoa int main(void) { int num; char str[24]; printf(" 임의의정수입력 : "); scanf("%d", &num); printf("\n입력된정수 : %d \n", num ); printf(" 2진수변환문자열 : %s \n", itoa(num, str, 2) ); printf("10진수변환문자열 : %s \n", itoa(num, str, 10) ); printf("16진수변환문자열 : %s \n", itoa(num, str, 16) ); } return 0; 32
참고문헌 [1] 서두옥, 이동호 ( 감수 ), ( 열혈강의 ) 또하나의 C : 프로그래밍은셀프입니다, 프리렉, 2012. [2] Paul Deitel, Harvey Deitel, "C How to Program", Global Edition, 8/E, Pearson, 2016. [3] SAMUEL P. HARBISON Ⅲ, GUY L. STEELE, C 프로그래밍언어, C : A Reference Manual, 5/E, Pearson Education Korea, 2005. [4] 문병로, 쉽게배우는알고리즘 - 관계중심의사고법, 개정판, 한빛아카데미, 2018. [5] 주우석, CㆍC++ 로배우는자료구조론, 한빛아카데미, 2015. [6] Behrouz A. Forouzan, Richard F. Gilberg, 김진외 7인공역, 구조적프로그래밍기법을위한 C, 도서출판인터비젼, 2004. [7] Brian W. Kernighan, Dennis M. Ritchie, 김석환외 2인공역, The C Programming Language, 2/E, 대영사, 2004. [8] 김일광, C 프로그래밍입문 : 프로그래밍을모국어처럼유창하게, 한빛미디어, 2004. [9] 정재은, " 다시체계적으로배우는 C 언어포인터 ", 정보문화사, 2003. 이강의자료는저작권법에따라보호받는저작물이므로무단전제와무단복제를금지하며, 내용의전부또는일부를이용하려면반드시저작권자의서면동의를받아야합니다. Copyright Clickseo.com. All rights reserved. 33