Microsoft PowerPoint - 06_(C_Programming)_(Korean)_Characters_Strings

Similar documents
C++ Programming

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

C++ Programming

Microsoft PowerPoint - chap10-함수의활용.pptx

PA for SWE2007

11장 포인터

untitled

Microsoft PowerPoint - 08_(C_Programming)_(Korean)_Preprocessing

PowerPoint 프레젠테이션

13 주차문자열의표현과입출력

Microsoft PowerPoint - 07_(C_Programming)_(Korean)_Composite_Data_Types

Microsoft PowerPoint - 7_배열_문자열

PA for SWE2007

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>

Microsoft PowerPoint - chap-12.pptx

슬라이드 1

Microsoft PowerPoint - 제9강 문자열

PA0 for SSE2033

YRRZBRRLMCEQ.hwp

이번장에서학습할내용 문자표현방법 문자열표현방법 문자열이란무엇인가? 문자열의입출력 문자처리라이브러리함수 표준입출력라이브러리함수 인간은문자를사용하여정보를표현하므로문자열은프로그램에서중요한위치를차지하고있다. 이번장에서는 C 에서의문자열처리방법에대하여자세히살펴볼것입니다. 2

歯7장.PDF

chap7.PDF

설계란 무엇인가?

Algorithms

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

11장 포인터

윤성우의 열혈 TCP/IP 소켓 프로그래밊

PowerPoint 프레젠테이션

11장 포인터

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드]

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - [CPI16] Lecture 10 - 문자열.pptx

Microsoft PowerPoint - 10장 문자열 pptx

Microsoft PowerPoint - chap06-4 [호환 모드]

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint Presentation

Microsoft PowerPoint - chap11-포인터의활용.pptx

Computer Programming (2008 Fall)

11장 포인터

11장 포인터

11장 포인터

11장 포인터

ch13

Microsoft PowerPoint - chap03-변수와데이터형.pptx

歯9장.PDF

<4D F736F F F696E74202D20C1A63132C0E520B9AEC0DABFCD20B9AEC0DABFAD>

11장 포인터

02장.배열과 클래스


Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

쉽게풀어쓴 C 언어 Express 제 12 장문자와문자열 이번장에서학습할내용 문자표현방법 문자열표현방법 문자열이란무엇인가? 문자열의입출력 문자처리라이브러리함수 표준입출력라이브러리함수 인간은문자를사용하여정보를표현하므로문자열은프로그램에서중요한위치를차지하

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>

untitled

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - 제12장 문자열(강의)

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

Microsoft PowerPoint - 11_C_Language_C_Standard_Library


제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

금오공대 컴퓨터공학전공 강의자료

chap7.key

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

심화프로그래밍 설계

untitled

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Presentation

K&R2 Reference Manual 번역본

Standard C Library.hwp

untitled

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

Microsoft PowerPoint - C++ 5 .pptx

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

OCW_C언어 기초

chap 5: Trees

Microsoft PowerPoint - chap12-고급기능.pptx

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

문서의 제목 나눔명조R, 40pt

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Microsoft PowerPoint - chap06-8 [호환 모드]

중간고사

Microsoft PowerPoint - 09_(C_Programming)_(Korean)_File_Processing

C Programming

商用

03 상수, 변수, 자료형

C++ Programming

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - chap04-연산자.pptx

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Microsoft PowerPoint - chap06-8.ppt

설계란 무엇인가?

ABC 6장

Microsoft PowerPoint - Chapter_07.pptx

Transcription:

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