문자열처리라이브러리 함수 설명 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를찾는다. W o r l d H e l l o 5-32
문자열의길이 strlen( Hello ) 는 5 를반환 문자열길이 (strlen) 5-33
문자열복사 char dst[6]; char src[6] = Hello"; strcpy(dst, src); 문자열복사 (strcpy) src H e l l o \0 dst H e l l o \0 5-34
문자열연결 문자열연결 char dst[12] = "Hello"; char src[6] = "World"; strcat(dst, src); H e l l o \0 W o r l d \0 dst src 5-35
예제 // 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! 5-36
문자열비교 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 보다아스키코드값이작으므로음수가반환된다. 5-37
예제 // 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; 5-38
문자검색 #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; 첫번째 g가 3에서발견되었음 5-39
문자열검색 #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 ); 첫번째 joy가 2에서발견되었음 5-40
strtok() 형식 char *strtok( char *s, const char *delimit ); 설명 strtok 함수는문자열 s 을토큰으로분리한다. 만약분리자가 일경우, 토큰을얻으려면다음과같이호출한다. t1 = strtok(s, " "); // 첫번째토큰 t2 = strtok(null, " "); // 두번째토큰 t3 = strtok(null, " "); // 세번째토큰 t4 = strtok(null, " "); // 네번째토큰 5-41
문자열토큰분리 // strtok 함수의사용예 #include <string.h> #include <stdio.h> char s[] = "Man is immortal, because he has a soul"; char seps[] = ",\t\n"; char *token; int main( void ) // 문자열을전달하고다음토큰을얻는다. token = strtok( s, seps ); while( token!= NULL ) // 문자열 s 에토큰이있는동안반복한다. printf( " 토큰 : %s\n", token ); // 다음토큰을얻는다. token = strtok( NULL, seps ); // 분리자 토큰 :Man 토큰 :is 토큰 : immortal 토큰 :because 토큰 :he 토큰 :has 토큰 :a 토큰 :soul 5-42
문자열수치변환 문자열과수치 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() 가키보드에서입력된문자열을숫자로변환합니다.. 5-43
예제 #include <stdio.h> int main( void ) char s1[] = "100 200 300"; char s2[30]; int value; sscanf(s1, "%d", &value); printf("%d\n", value); sprintf(s2, "%d", value); printf("%s\n", s2); return 0; 100 100 5-44
예제 #include <stdio.h> #include <string.h> int main(void) char filename[100]; char s[100]; int i; for(i=0; i < 6; i++) strcpy(filename, "image"); sprintf(s, "%d", i); strcat(filename, s); strcat(filename, ".jpg"); printf("%s \n", filename); return 0; image0.jpg image1.jpg image2.jpg image3.jpg image4.jpg image5.jpg 5-45
문자열을수치로변환하는전용함수 전용함수는 scanf() 보다크기가작다. stdlib.h에원형정의- 반드시포함 함수 설명 int atoi( const char *str ); str을 int형으로변환한다. long atoi( const char *str ); str을 long형으로변환한다. double atof( const char *str ); str을 double형으로변환한다. 5-46
문자열수치변환 #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; 5-47
문자열의배열 (Q) 문자열이여러개있는경우에는어떤구조를사용하여저장하면제일좋을까? (A) 여러개의문자배열을각각만들어도되지만문자열의배열을만드는것이여러모로간편하다. 문자열이문자배열에저장되므로문자열의배열은배열의배열, 즉 2차원문자배열이된다. char s[3][6] = "init", "open", "close" ; 열 S e o u l \0 s[0][0] s[0][1] s[0][2] s[0][3] s[0][4] s[0][5] S e o u l \0 s[1][0] s[1][1] s[1][2] s[1][3] s[1][4] s[1][5] 행 S e o u l \0 s[2][0] s[2][1] s[2][2] s[2][3] s[2][4] s[2][5] 5-48
2 차원배열로입력 #include <stdio.h> int main( void ) int i; char fruits[3][20]; for(i = 0; i < 3; i++) printf(" 과일이름을입력하시오 : ", fruits[i]); scanf("%s", fruits[i]); for(i = 0; i < 3; i++) printf("%d번째과일 : %s\n", i, fruits[i]); return 0; 과일이름을입력하시오 : 사과과일이름을입력하시오 : 배과일이름을입력하시오 : 포도 0번째과일 : 사과 1번째과일 : 배 2번째과일 : 포도 5-49
File open 의의미 File open (1) 파일에서데이터를읽거나쓸수있도록모든준비를마치는것을의미 파일을연다음에는데이터를읽기, 쓰기가능 File open File read & write File close 순으로진행 FILE 구조체를통하여파일에접근 FILE 구조체를가리키는포인터를파일포인터 (file pointer) 라고한다 각각의파일마다하나의파일포인터가필요 FILE *fopen (const char *name, const char *mode); name : 파일의이름을나타내는문자열 mode : 파일을여는방식 5-50
File open (2) File mode 모드 r 읽기모드로파일을연다. w a 설명 쓰기모드로파일을생성한다. 만약파일이존재하지않으면파일이생성된다. 파일이이미존재하면기존의내용이지워진다. 추가모드로파일을연다. 만약똑같은이름의기존의파일이있으면데이터가파일의끝에추가된다. 파일이없으면새로운파일이만들어진다. r+ 읽기와쓰기모드로파일을연다. 파일이반드시존재해야한다. w+ a+ 읽기와쓰기모드로파일을생성한다. 만약파일이존재하지않으면파일이생성된다. 파일이존재하면새데이터가기존파일의데이터에덮어쓰인다. 읽기와추가모드로파일을연다. 만약똑같은이름의기존의파일이있으면데이터가파일의끝에추가된다. 읽기는어떤위치에서나가능하다. 파일이없으면새로운파일을만든다. b 이진파일모드로파일을연다. 5-51
fclose() File close 열린파일을닫는함수 stdio.h에정의 성공적으로파일을닫는경우에는 0이반환 만약실패한경우에는 -1이반환 int fclose (FILE *stream) 5-52
Sample.txt 생성 Project -> sample.txt 생성 File open/close 예제 File open/close #include "stdio.h" int main() FILE *fp = NULL; fp = fopen("sample.txt", "w"); //FILE 포인터fp를생성하고NULL로초기화 // 파일을쓰기모드로열고, 그주소를 fp에저장 if (fp == NULL) printf(" 파일열기실패 \n"); else printf(" 파일열기성공 \n"); fclose(fp); // 파일닫기 return 0; 5-53
형식화된입출력 텍스트파일읽기와쓰기 (2) 정수나실수데이터를파일에문자열로바꾸어서저장 fprintf() 사용방법은 printf() 와비슷하나, 화면이아닌파일에출력 int fprintf( FILE *fp, const char *format, ); fprintf() 사용예제 #include <stdio.h> int main() int i = 23; float f = 1.2345; FILE *fp = NULL; fp = fopen("sample.txt", "w"); //FILE 포인터fp를생성하고NULL로초기화 // 파일을쓰기모드로열고, 그주소를 fp에저장 if(fp!= NULL) fprintf(fp, "%10d %16.4f", i, f); fclose(fp); // 파일닫기 return 0; 5-54
텍스트파일읽기와쓰기 (3) fscanf() scanf() 와사용법은비슷하지만입력대상이키보드가아닌파일 int fscanf( FILE *fp, const char *format, ); fscanf() 사용예제 #include <stdio.h> int main() int i; float f; FILE *fp = NULL; fp = fopen("sample.txt", "r"); //FILE 포인터fp를생성하고 NULL로초기화 // 파일을읽기모드로열고, 그주소를 fp에저장 if(fp!= NULL) fscanf(fp, "%d %f", &i, &f); printf(" %d\n %f\n", i, f); // 화면에출력 fclose(fp); // 파일닫기 return 0; 5-55
/** FileInputOutput.cpp */ 파일입력, 출력예제프로그램 /* * Programmed by Prof. YT Kim ( 2012. 11. 20.) */ #include <stdio.h> #include <string.h> #define MAX_WORD_LEN 50 #define NUM_WORDS 100 int main() FILE *pfin = NULL; FILE *pfout = NULL; char str[80]; char wordlist[num_words][max_word_len]; int word_count; pfin = fopen("input.txt", "r"); if (pfin == NULL) printf("error in input data file open!! n"); return 0; 5-56
/** FileInputOutput.cpp (2) */ pfout = fopen("output.txt", "w"); if (pfout == NULL) printf("error in output data file creation!! n"); return 0; word_count = 0; while (fscanf(pfin, "%s", str)!= EOF) printf("%2d-th input word: %s n", word_count, str); strcpy(wordlist[word_count], str); word_count++;; printf("number of words: %d n", word_count); for (int i=0; i<word_count; i++) fprintf(pfout, "wordlist[%2d]: %s (length: %d) n", i, wordlist[i], strlen(wordlist[i])); fprintf(pfout, " n"); fclose(pfin); fclose(pfout); 5-57
input.txt one two three four five six seven eight nine ten January February March April May June July August September October Sunday Monday Tuesday Wednesday Thursday Friday Saturday week day month China India UnitedStates Indonesia Brazil Pakistan Nigeria Russia Bangladesh Japan Mexico Philippines Vietnam Ethiopia Germany Egypt Iran Turkey Congo Thailand France UnitedKingdom Italy 5-58
output.txt wordlist[ 0]: one (length: 3) wordlist[ 1]: two (length: 3) wordlist[ 2]: three (length: 5) wordlist[ 3]: four (length: 4) wordlist[ 4]: five (length: 4) wordlist[ 5]: six (length: 3) wordlist[ 6]: seven (length: 5) wordlist[ 7]: eight (length: 5) wordlist[ 8]: nine (length: 4) wordlist[ 9]: ten (length: 3) wordlist[10]: January (length: 7) wordlist[11]: February (length: 8) wordlist[12]: March (length: 5) wordlist[13]: April (length: 5) wordlist[14]: May (length: 3) wordlist[15]: June (length: 4) wordlist[16]: July (length: 4) wordlist[17]: August (length: 6) wordlist[18]: September (length: 9) wordlist[19]: October (length: 7) wordlist[20]: Sunday (length: 6) wordlist[21]: Monday (length: 6) wordlist[22]: Tuesday (length: 7) wordlist[23]: Wednesday (length: 9) wordlist[24]: Thursday (length: 8) wordlist[25]: Friday (length: 6) wordlist[26]: Saturday (length: 8) wordlist[27]: week (length: 4) wordlist[28]: day (length: 3) wordlist[29]: month (length: 5) wordlist[30]: China (length: 5) wordlist[31]: India (length: 5) wordlist[32]: UnitedStates (length: 12) wordlist[33]: Indonesia (length: 9) wordlist[34]: Brazil (length: 6) wordlist[35]: Pakistan (length: 8) wordlist[36]: Nigeria (length: 7) wordlist[37]: Russia (length: 6) wordlist[38]: Bangladesh (length: 10) wordlist[39]: Japan (length: 5) wordlist[40]: Mexico (length: 6) wordlist[41]: Philippines (length: 11) wordlist[42]: Vietnam (length: 7) wordlist[43]: Ethiopia (length: 8) wordlist[44]: Germany (length: 7) wordlist[45]: Egypt (length: 5) wordlist[46]: Iran (length: 4) wordlist[47]: Turkey (length: 6) wordlist[48]: Congo (length: 5) wordlist[49]: Thailand (length: 8) wordlist[50]: France (length: 6) wordlist[51]: UnitedKingdom (length: 13) wordlist[52]: Italy (length: 5) 5-59
Homework 5 5.1 영문자를처리하는프로그램 1) 10 개의 ASCII 단어를입력파일 input.dat 로부터입력하여 character array에저장하라. 각단어는최대 15 자이내이며, 입력데이터파일의내용은다음과같다. one two three four five six seven eight nine ten 2) strlen(char *) 함수를이용하여각단어의길이를찾고, 이를 integer array에저장하라. 3) 입력단어들을해당단어길이와함께, 한줄에한단어씩, 출력화일 output.dat 에출력하라. 4) 입력단어들을 strcmp(char *, char *) 함수와 quick sorting을사용하여오름차순 (ascending order) 으로정렬 (sorting) 하고, 그결과를출력파일 output.dat 에출력하라. 5-60
5.2 ASCII 문자를입력받아 16 진수로변환하기 1) 0 ~ 9, A ~ F 사이에있는 ASCII 코드문자열을매개변수로전달받은후, 이를 16진수로변환하여정수 (integer) 형으로반환하는함수를작성하라. int atox(char *str); 2) printf( %d, d) 함수를사용하여, 저장된정수값을 10진수로출력하라. 3) 하나의정수값과문자 pointer를매개변수로전달받은후, 전달된정수값을 16진수의 ASCII 코드로변환하여, 문자 pointer가지정하는 string buffer 에저장하는함수를작성하라. void xtoa(int d, char *str); 4) 표준입력장치로부터 0 ~ 9, A ~ F 사이에있는 ASCII 코드문자로구성된 16진수데이터를입력받은후, 위의 atox() 함수를사용하여정수값으로변환하고, 이변환된정수값을위에서구현한 xtoa() 함수를사용하여 16진수 ASCII 문자열로변환한후, 이를출력하는프로그램을작성하라. 5-61