13 주차문자열의표현과입출력
문자표현방법 문자열표현방법 문자열이란무엇인가? 문자열의입출력 문자처리라이브러리함수 표준입출력라이브러리함수
C 언어를이용하여문자열을처리하기위해서는문자형의배열이나포인터를사용하게된다. 문자열을처리하는동작으로는단순하게문자열의입력이나출력기능이외에도문자열의복사나치환, 문자열의길이를구하거나문자열을비교하는기능등많은기능을필요로한다. 그러나이러한기능들을모두구현하기란매우까다로우며, 원래의프로그램에서구현하고자하는기능보다더많은노력을기울여야할수도있다.
문자의다양한표현방법 컴퓨터에서는각각의문자에숫자코드를붙여서표시한다. 아스키코드 (ASCII code): 표준적인 8비트문자코드 0 에서 127 까지의숫자를이용하여문자표현 유니코드 (unicode): 표준적인 16 비트문자코드 전세계의모든문자를일관되게표현하고다룰수있도록설계
문자열 (string): 문자들이여러개모인것 "A" "Hello World!" " 변수 score 의값은 %d 입니다 문자열변수 변경가능한문자열을저장할수있는변수 어디에저장하면좋은가?
NULL 문자 : 문자열의끝을나타낸다. 문자열은어디서종료되는지알수가없으므로표시를해주어야한다.
예제 문자변수 문자상수 // 문자상수 #include <stdio.h> 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;
예제 // 아스키코드출력 #include <stdio.h> int main(void) { unsigned char code; for(code = 32; code < 128; code++) { printf(" 아스키코드 %d은 %c입니다.\n", code, code); return 0;
예제 #include <stdio.h> int main(void) { int i; char str[4]; str[0] = 'a'; str[1] = 'b'; str[2] = 'c'; str[3] = '\0'; i = 0; while(str[i]!= '\0') { printf("%c", str[i]); i++; return 0;
예제 #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] = src[i]; dst[i] = NULL; printf(" 복사된문자열 =%s\n", dst); return 0; 원본문자열 =The worst things to eat before you sleep 복사된문자열 =The worst things to eat before you sleep
예제 // 문자열의길이를구하는프로그램 #include <stdio.h> 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 language is easy" 의길이는 18 입니다.
1. 문자배열의각각의원소를개별적으로변경 str[0] = 'W'; str[1] = 'o'; str[2] = 'r'; str[3] = 'l'; str[4] = 'd'; str[5] = '\0'; 2. strcpy() 를사용하여문자열을문자배열에복사 strcpy(str, "World"); // 추후에학습
문자열상수 : HelloWorld 와같이프로그램소스안에포함된문자열 문자열상수는메모리영역중에서텍스트세그먼트 (text segment) 에저장 char *p = "HelloWorld";
char *p = "HelloWorld"; p[0] = A ; // 또는 strcpy(p, Goodbye ); p 를통하여텍스트세그먼트에문자를저장하려면오류가발생한다. 오류가발생하여프로그램중지
문자입출력라이브러리 입출력함수 설명 int getchar(void) 하나의문자를읽어서반환한다. void putchar(int c) 변수 c에저장된문자를출력한다. int getch(void) 하나의문자를읽어서반환한다 ( 버퍼를사용하지않음 ). void putch(int c) 변수 c에저장된문자를출력한다 ( 버퍼를사용하지않음 ). scanf("%c", &c) 하나의문자를읽어서변수 c에저장한다. printf("%c", c); 변수 c에저장된문자를출력한다.
예제 // getchar() 의사용 #include <stdio.h> int main(void) { int ch; // 정수형에주의 while( (ch = getchar())!= EOF ) putchar(ch); return 0; End Of File 을나타내는문자, EOF 는정수형이다.
예제 #include <stdio.h> #include <conio.h> int main(void) { int ch; while( (ch = _getch())!= 'q' ) _putch(ch); return 0; 버퍼를사용하지않는다, 에코도없음!
함수별문자처리방식이서로다름 _getch(), _getche(), getchar() 헤더파일버퍼사용여부에코여부응답성문자수정여부 getchar() <stdio.h> 사용함 ( 엔터키를눌러입력됨 ) _getch() <conio.h> 사용하지않음 에코줄단위가능 에코하지않음 문자단위 불가능 _getche() <conio.h> 사용하지않음에코문자단위불가능
다양한문자입출력함수 입출력함수 int scanf("%s", s) 설명 문자열을읽어서문자배열 s[] 에저장 int printf("%s", s) 배열 s[] 에저장되어있는문자열을출력한다. char *gets(char *s) 한줄의문자열을읽어서문자배열 s[] 에저장한다. int puts(const char *s) 배열 s[] 에저장되어있는한줄의문자열을출력한다.
gets() 와 puts() 문자열입출력함수 char *gets(char *buffer); int puts(const char *str); gets() 표준입력으로부터엔터키가나올때까지한줄의라인을입력 문자열에줄바꿈문자 ('\n') 는포함되지않으며대신에자동으로 NULL 문자 ('\0') 를추가한다. 입력받은문자열은 buffer 가가리키는주소에저장된다.
char *gets(char *buffer); int puts(const char *str); puts() str 이가리키는문자열을받아서화면에출력 NULL 문자 ('\0') 는줄바꿈문자 ('\n') 로변경 char *menu = " 파일열기 : open, 파일닫기 : close"; puts(str);
예제 #include <stdio.h> int main(void) { char name[100]; char address[100]; printf(" 이름을입력하시오 : "); gets(name); printf(" 현재거주하는주소를입력하시오 : "); gets(address); puts(name); puts(address); return 0; 한단어이상을입력받을때에사용한다.
문자를검사하거나문자를변환한다. 함수 설명 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;
예제 #include <stdio.h> #include <conio.h> #include <ctype.h> int main( void ) { int c; while((c = getch())!= 'z') { printf("------------------------\n"); printf("isdigit(%c) = %d\n", c, isdigit(c)); printf("isalpha(%c) = %d\n", c, isalpha(c)); printf("islower(%c) = %d\n", c, islower(c)); printf("ispunct(%c) = %d\n", c, ispunct(c)); printf("isxdigit(%c) = %d\n", c, isxdigit(c)); printf("isprint(%c) = %d\n", c, isprint(c)); printf("------------------------\n\n"); return 0; 숫자인지검사알파벳인지검사소문자인지검사구두점문자인지검사 16진수인지검사출력가능한지검사
다양한문자열관련함수 함수 설명 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를찾는다.
문자열의길이 strlen( Hello ) 는 5 를반환 * 문자열복사 char dst[6]; char src[6] = Hello"; strcpy(dst, src); * 문자열연결 char dst[12] = "Hello"; char src[6] = "World"; strcat(dst, src);
예제 // 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;
int strcmp( const char *s1, const char *s2 ); 반환값 s1과 s2의관계 <0 s1이 s2보다앞에있다. 0 s1이 s2와같다. >0 s1이 s2보다뒤에있다.
예제 // strcmp() 함수 #include <string.h> #include <stdio.h> int main( void ) { char s1[80]; char s2[80]; int result; // 첫번째단어를저장할문자배열 // 두번째단어를저장할문자배열 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;
예제 #include <string.h> #include <stdio.h> int main( void ) { char s[] = "language"; char c = 'g'; char *p; int loc; s 안에서문자 c 를찾는다. p = strchr(s, c); loc = (int)(p - s); if ( p!= NULL ) printf( " 첫번째 %c가 %d에서발견되었음 \n", c, loc ); else printf( "%c가발견되지않았음 \n", c ); return 0;
예제 #include <string.h> #include <stdio.h> int main( void ) { char s[] = "A joy that's shared is a joy made double"; char sub[] = "joy"; char *p; s 안에서문자열 sub를찾는다. int loc; p = strstr(s, sub); loc = (int)(p - s); if ( p!= NULL ) printf( " 첫번째 %s가 %d에서발견되었음 \n", sub, loc ); else printf( "%s가발견되지않았음 \n", sub );
문자열을수치로변환하는전용함수 전용함수는 scanf() 보다크기가작다. stdlib.h 에원형정의 - 반드시포함 함수 설명 int atoi( const char *str ); str 을 int 형으로변환한다. long atoi( const char *str ); str 을 long 형으로변환한다. double atof( const char *str ); str 을 double 형으로변환한다.