쉽게풀어쓴 C 언어 Express 제 12 장문자와문자열
이번장에서학습할내용 문자표현방법 문자열표현방법 문자열이란무엇인가? 문자열의입출력 문자처리라이브러리함수 표준입출력라이브러리함수 인간은문자를사용하여정보를표현하므로문자열은프로그램에서중요한위치를차지하고있다. 이번장에서는 C 에서의문자열처리방법에대하여자세히살펴볼것이다.
문자의중요성 인간한테텍스트는대단히중요하다. 많은컴퓨터작업이텍스트를사용하여서이루어진다. 컴퓨터 사용자
문자표현방법 컴퓨터에서는각각의문자에숫자코드를붙여서표시한다. 아스키코드 (ASCII code): 표준적인 8비트문자코드 0에서 127까지의숫자를이용하여문자표현 유니코드 (unicode): 표준적인 16비트문자코드 전세계의모든문자를일관되게표현하고다룰수있도록설계 65 69 71 74 78 C 에서문자는숫자로표현됩니다.
문자열표현방법 문자열 (string): 문자들이여러개모인것 "A" "Hello World!" " 변수 score의값은 %d입니다 H 문자열은여러개의문자로이루어져있으므로문자배열로저장이가능해요. 문자열의저장 문자배열사용 하나의문자는 char 형변수로저장 H E L L o \0 문자열은 char 형배열로저장
NULL 문자 NULL 문자 : 문자열의끝을나타낸다. 끝 NULL 문자는문자열의끝을나타냅니다. S E O U L \0 문자열은어디서종료되는지알수가없으므로표시를해주어야한다. seou, seoul, seoul#, seoul#%,...??? 쓰레기값 s e o u l # %? & $ str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9]
문자변수와문자상수 문자변수 문자상수 // 문자상수 #include <stdio.h> 65 int main(void) { char code1 = 'A'; char code2 = 65; } printf("code1=%c, code1=%d\n", code1,code1); printf("code2=%c, code2=%d\n", code2,code2); return 0; code1=a, code1=65 code2=a, code2=65
아스키코드출력 // 아스키코드출력 #include <stdio.h> int main(void) { unsigned char code; 32 : ( 공백 ) 부터 127 : 까지출력 } for(code = 32; code < 128; code++) { } return 0; printf(" 아스키코드 %d 은 %c 입니다.\n", code, code); 아스키코드 32 은입니다. 아스키코드 33 은! 입니다.... 아스키코드 65 은 A 입니다. 아스키코드 66 은 B 입니다.... 아스키코드 97 은 a 입니다. 아스키코드 98 은 b 입니다.... 아스키코드 126 은 ~ 입니다. 아스키코드 127 은 입니다.
예제 #1 #include <stdio.h> int main(void) { int i; char str[4]; str[0] = 'a'; str[1] = 'b'; str[2] = 'c'; str[3] = '\0'; 문자배열에들어있는문자들을하나씩출력하여보자. 문자배열에저장된문자열을출력할때는 %s 를사용하면되지만여기서는문자열처리의기본적인방법을실감하기위하여문자배열에들어있는문자들을하나씩화면에출력하다가 NULL 문자가나오면반복을종료하도록하였다. } i = 0; while(str[i]!= '\0') { printf("%c", str[i]); i++; } return 0; abc
문자배열의초기화 char str[4] = { 'a', 'b', 'c', '\0' }; char str[4] = "abc ; char str[6] = "abc"; char str[4] = ""; char str[] = "abc"; char str[4] = "abcdef";
문자열의출력 char str[] = abc ; printf( %s, str); abc char str[] = abc ; printf(str);
예제 #2 #include <stdio.h> int main(void) { char str1[6] = "Seoul ; char str2[3] = { 'i', 's, \0 }; char str3[] = "the capital city of Korea. ; Seoul is the capital city of Korea. } printf("%s %s %s\n", str1, str2, str3); S e o u l \0 str1[0] str1[1] str1[2] str1[3] str1[4] str1[5] i s \0 str2[0] str2[1] str2[2] str1 str2 t h e... K o r e a \0 str3[ ] str3[ ] str3[ ] str3[ ].... str3[ ] str3[ ] str3[ ] str3[ ] str3[ ] str3[ ] str3
예제 #3 #include <stdio.h> int main(void) { } char src[] = "The worst things to eat before you sleep"; char dst[100]; int i; printf(" 원본문자열 =%s\n", src); for(i=0 ; src[i]!= NULL ; i++) dst[i] = NULL; dst[i] = src[i]; printf(" 복사된문자열 =%s\n", dst); return 0; NUL 문자가나올때까지반복하면서각각의문자들을새로운배열로복사한다. 원본문자열 =The worst things to eat before you sleep 복사된문자열 =The worst things to eat before you sleep
문자열길이계산예제 // 문자열의길이를구하는프로그램 #include <stdio.h> 문자열 "C language is easy" 의길이는 18 입니다. int main(void) { char str[30] = "C language is easy"; int i = 0; while(str[i]!= 0) i++; printf(" 문자열 \"%s\" 의길이는 %d 입니다.\n", str, i); } return 0; C i s... e a s y \0... str[18] == 0 이므로카운터 str[0] str[1] str[2] str[3].... str[13] str[14] str[15] str[16] str[17] str[18] str[19].... str[28] str[29] 종료 ( \0 의아스키코드값은 0이다 ) 15 14 18 23 04 1 i
문자배열에문자열을저장 1. 각각의문자배열원소에원하는문자를개별적으로대입하는방법이다. str[0] = 'W'; str[1] = 'o'; str[2] = 'r'; str[3] = 'l'; str[4] = 'd'; str[5] = '\0'; 2. strcpy() 를사용하여문자열을문자배열에복사 strcpy(str, "World"); // 추후에학습
중간점검 C 에서문자열은어떻게정의되는가? 문자열에서 NULL 문자의역할은무엇인가? NULL 문자의아스키코드값은얼마인가? NULL 문자로끝나지않는문자열을출력하면어떻게되는가? B, 'B', "B" 의차이점을설명하라. 문자열의크기보다문자배열의크기를하나더크게하는이유는무엇인가? 문자배열을문자열로초기화하는방법을아는대로설명하라.
문자입출력라이브러리 입출력함수 설명 int getchar(void) 하나의문자를읽어서반환한다. void putchar(int c) 변수 c에저장된문자를출력한다. scanf("%c", &c) 하나의문자를읽어서변수 c에저장한다. printf("%c", c); 변수 c에저장된문자를출력한다.
getchar(), putchar() // getchar() 의사용 #include <stdio.h> int main(void) { int ch; // 정수형에주의 while( (ch = getchar())!= EOF ) putchar(ch); return 0; } ^Z A B A A B B ^Z 입력 출력 ch
문자열입출력라이브러리함수 입출력함수 설명 int scanf("%s", s) 문자열을읽어서문자배열 s[] 에저장 int printf("%s", s) 배열 s[] 에저장되어있는문자열을출력한다. char *gets(char *s) 한줄의문자열을읽어서문자배열 s[] 에저장한다. int puts(const char *s) 배열 s[] 에저장되어있는한줄의문자열을출력한다. Hello World!... 프로그램
gets() 와 puts() 문자열입출력 gets() 표준입력으로부터엔터키가나올때까지한줄의라인을입력 문자열에줄바꿈문자 ('\n') 는포함되지않으며대신에자동으로 NULL 문자 ('\0') 를추가한다. 입력받은문자열은 buffer 가가리키는주소에저장된다.
gets() 와 puts() 문자열입출력 puts() str 이가리키는문자열을받아서화면에출력 NULL 문자 ('\0') 는줄바꿈문자 ('\n') 로변경
예제 #include <stdio.h> int main(void) { char name[100]; char address[100]; printf(" 이름을입력하시오 : "); gets(name); printf(" 현재거주하는주소를입력하시오 : "); gets(address); puts(name); puts(address); return 0; } 한단어이상을입력받을때에사용한다. 이름을입력하시오 : 홍길동현재거주하는주소를입력하시오 : 서울시종로구 100 번지홍길동서울시종로구 100 번지
문자처리라이브러리함수 문자를검사하거나문자를변환한다. 함수 설명 isalpha(c) c가영문자인가?(a-z, A-Z) isupper(c) c가대문자인가?(a-z) islower(c) c가소문자인가?(a-z) isdigit(c) c가숫자인가?(0-9) isalnum(c) c가영문자이나숫자인가?(a-z, A-Z, 0-9) isxdigit(c) c가 16진수의숫자인가?(0-9, A-F, a-f) isspace(c) c가공백문자인가?(, \n', '\t', '\v', '\r') ispunct(c) c가구두점문자인가? isprint(c) C가출력가능한문자인가? iscntrl(c) c가제어문자인가? isascii(c) c가아스키코드인가?
문자처리라이브러리함수 문자를검사하거나문자를변환한다. 함수 설명 toupper(c) c를대문자로바꾼다. tolower(c) c를소문자로바꾼다. toascii(c) c를아스키코드로바꾼다.
예제 #include <stdio.h> #include <ctype.h> int main( void ) { int c; 소문자인지검사 대문자로변환 } while((c = getchar())!= EOF) { if( islower(c) ) c = toupper(c); putchar(c); } return 0; abcdef ABCDEF ^Z
문자열처리라이브러리 함수 설명 strlen(s) 문자열 s의길이를구한다. strcpy(s1, s2) s2를 s1에복사한다. strcat(s1, s2) s2를 s1의끝에붙여넣는다. strcmp(s1, s2) s1과 s2를비교한다. strncpy(s1, s2, n) s2의최대 n개의문자를 s1에복사한다. strncat(s1, s2, n) s2의최대 n개의문자를 s1의끝에붙여넣는다. strncmp(s1, s2, n) 최대 n개의문자까지 s1과 s2를비교한다. strchr(s, c) 문자열 s안에서문자 c를찾는다. strstr(s1, s2) 문자열 s1에서문자열 s2를찾는다. H e l l o W o r l d
문자열길이 문자열의길이 strlen( Hello ) 는 5 를반환
문자열복사 문자열복사 char dst[6]; char src[6] = Hello"; strcpy(dst, src); H e l l o \0 src H e l l o \0 dst
문자열연결 문자열연결 char dst[12] = "Hello"; char src[6] = "World"; strcat(dst, src); dst H e l l o \0 src W o r l d \0
예제 // strcpy 와 strcat #include <string.h> #include <stdio.h> int main( void ) { char string[80]; } strcpy( string, "Hello world from " ); strcat( string, "strcpy " ); strcat( string, "and " ); strcat( string, "strcat!" ); printf( "string = %s\n", string ); return 0; 복사하기 문자열연결문자열연결 문자열연결 string = Hello world from strcpy and strcat!
= = = = > 문자열비교 int strcmp( const char *s1, const char *s2 ); 반환값 s1과 s2의관계 <0 s1이 s2보다작다 0 s1이 s2와같다. >0 s1이 s2보다크다. s1 s t r c m p \0 s2 s t r c p y \0 m 이 p 보다아스키코드값이작으므로음수가반환된다.
// strcmp() 함수 #include <string.h> #include <stdio.h> int main( void ) { char s1[80]; char s2[80]; int result; 예제 // 첫번째단어를저장할문자배열 // 두번째단어를저장할문자배열 첫번째단어를입력하시오 :Hello 두번째단어를입력하시오 :World Hello 가 World 보다앞에있습니다. printf(" 첫번째단어를입력하시오 :"); scanf("%s", s1); printf(" 두번째단어를입력하시오 :"); scanf("%s", s2); } result = strcmp(s1, s2); if( result < 0 ) printf("%s 가 %s 보다앞에있읍니다.\n", s1, s2); else if( result == 0 ) printf("%s 가 %s 와같습니다.\n", s1, s2); else printf("%s 가 %s 보다뒤에있습니다.\n", s1, s2); return 0;
중간점검 문자열 s1 를문자열 s2 로복사하는문장을써라. String" 을저장하려면최소한어떤크기이상의문자배열이필요한가? 문자열을서로비교하는함수는? s1[] 에저장된문자열뒤에 s2[] 를붙이고싶으면어떤라이브러리함수를어떻게사용하여야하는가? strcmp("dog", "dog") 의반환값은얼마인가?
문자열수치변환 문자열과수치 3 6. 5 \0 src[0] src[1] src[2] src[3] src[4] src[5] 36.5 v 문자열 수치 scanf() 함수는문자열을수치로변환한다. 3 6. 5 \0 36.5 scanf()... scanf( %f, x);... scanf() 가키보드에서입력된문자열을숫자로변환합니다..
문자열을수치로변환하는전용함수 전용함수는 scanf() 보다크기가작다. stdlib.h 에원형정의 - 반드시포함 함수 설명 int atoi( const char *str ); str 을 int 형으로변환한다. long atoi( const char *str ); str 을 long 형으로변환한다. double atof( const char *str ); str 을 double 형으로변환한다.
#include <stdio.h> #include <stdlib.h> int main( void ) { char s1[] = "100"; char s2[] = "12.93"; char buffer[100]; int i; double d, result; 문자열수치변환 i = atoi(s1); d = atof(s2); result = i + d; sprintf(buffer, "%f", result); printf(" 연산결과는 %s 입니다.\n", buffer); 연산결과는 112.930000 입니다. } return 0;
문자열의배열 (Q) 문자열이여러개있는경우에는어떤구조를사용하여저장하면제일좋을까? (A) 여러개의문자배열을각각만들어도되지만문자열의배열을만드는것이여러모로간편하다. 문자열이문자배열에저장되므로문자열의배열은배열의배열, 즉 2차원문자배열이된다. 열 char s[3][6] = { "init", "open", "close" }; i n i t \0 s[0][0] s[0][1] s[0][2] s[0][3] s[0][4] s[0][5] o p e n \0 s[1][0] s[1][1] s[1][2] s[1][3] s[1][4] s[1][5] 행 c l o s e \0 s[2][0] s[2][1] s[2][2] s[2][3] s[2][4] s[2][5]
2 차원배열로입력 #include <stdio.h> int main( void ) { int i; char fruits[3][20]; for(i = 0; i < 3; i++) { } for(i = 0; i < 3; i++) return 0; printf(" 과일이름을입력하시오 : ); scanf("%s", fruits[i]); printf("%d 번째과일 : %s\n", i, fruits[i]); } 과일이름을입력하시오 : 사과과일이름을입력하시오 : 배과일이름을입력하시오 : 포도 0 번째과일 : 사과 1 번째과일 : 배 2 번째과일 : 포도
Q & A