21장. 문자와 문자열 처리 함수
21-1 스트림과 데이터의 전송 입출력의 이해 스트림에 대한 이해 파일, 콘솔, 소켓 입출력 21-1 스트림과 데이터의 전송 입출력의 이해 파일, 콘솔, 소켓 입출력 스트림에 대한 이해 데이터를 송수신 하기 위한 일종의 다리 그림 21-1
21-1 스트림과 데이터의 전송 표준 입출력 스트림 프로그램 실행 시 자동으로 생성 및 소멸 21-1 스트림과 데이터의 전송 표준 입출력 스트림 프로그램 실행 시 자동으로 생성 및 소멸 모니터와 키보드를 그 대상으로 함 이름 스트림의 종류 입·출력 장치 stdin 표준 입력 스트림 키보드 stdout 표준 출력 스트림 모니터 stderr 표준 에러 스트림 표 21-1
21-2 문자 단위 입출력 함수 문자 출력 함수 문자 입력 함수 #include <stdio.h> 21-2 문자 단위 입출력 함수 문자 출력 함수 #include <stdio.h> Int putchar(int c); Int fputc(int c, FILE* stream) 에러가 발생하는 경우 EOF 리턴 문자 입력 함수 #include <stdio.h> Int getchar(void); Int fgetc(FILE* stream); 에러가 발생하거나 파일의 끝에 도달하는 경우 EOF 리턴
21-2 문자 단위 입출력 함수 EOF에 대한 이해 문자 단위 입 출력 함수의 필요성 21-2 문자 단위 입출력 함수 EOF에 대한 이해 fgetc, getchar 함수가 파일의 끝에 도달하는 경우 반환 End-Of-File의 약자로서, 파일의 끝을 표현하기 위한 상수 (-1의 값을 지닌다) 콘솔의 경우 Ctrl-Z가 파일의 EOF를 의미 예제 Ctrl_Z.c 참조 문자 단위 입 출력 함수의 필요성 용도에 맞는 적절한 함수를 제공함으로써 성능 향상을 도모
21-2 문자 단위 입출력 함수 /* Ctrl_Z.c*/ /* char_IO.c*/ 21-2 문자 단위 입출력 함수 /* char_IO.c*/ #include <stdio.h> int main() { char ch=0; while(ch != 'q') ch=getchar(); putchar(ch); } return 0; /* Ctrl_Z.c*/ #include <stdio.h> int main() { char ch=0; while(ch != EOF) ch=getchar(); putchar(ch); } printf("program 종료 \n"); return 0;
21-3 문자열 단위 입출력 함수 문자열 출력 함수 문자열 입력 함수 #include <stdio.h> 21-3 문자열 단위 입출력 함수 문자열 출력 함수 #include <stdio.h> Int puts(const char* s); Int fputs(const char* s, FILE* stream) 에러가 발생하는 경우 EOF 리턴 문자열 입력 함수 #include <stdio.h> char* gets(char* s); char* fgets(char* s, int n, FILE* stream); 오류가 발생하거나 파일의 끝에 도달하는 경우 NULL 포인터 리턴
21-3 문자열 단위 입출력 함수 /* puts_fputs.c*/ #include <stdio.h> 21-3 문자열 단위 입출력 함수 /* puts_fputs.c*/ #include <stdio.h> int main() { fputs("fputs 함수에 의한 출력, ", stdout); fputs("I Love Linux ", stdout); fputs("\n", stdout); // 한 줄 건너 뛰기 위해서. puts("puts 함수에 의한 출력,"); puts("I Love Linux "); return 0; } /* fputs.c */ #include <stdio.h> int main() { char str[10]; fputs("문자열을 입력 하세요 : ", stdout); fgets(str, sizeof(str), stdin); fputs("입력된 문자열 : ", stdout); fputs(str, stdout); return 0; }
21-4 표준 입출력과 버퍼(Buffer) 입출력 사이에 존재하는 버퍼의 이해 여분의 임시 메모리적 특징을 지닌다. 성능 향상이 목적이다. 모아서 보내고, 모아서 받고... 그림 21-2
21-4 표준 입출력과 버퍼(Buffer) 버퍼를 비우는 작업을 하는 fflush 함수 fflush 함수의 필요성 예제 fflush.c 참조 #include <stdio.h> int fflush(FILE * stream); 성공 시 0, 실패 시 EOF 리턴 그림 21-3
21-4 표준 입출력과 버퍼(Buffer) /* fflush.c */ #include <stdio.h> int main(void) { char perID[7]; // 6+null문자=7 char name[10]; fputs("주민번호 앞 6 자리를 입력하세요 : ", stdout); fgets(perID, sizeof(perID), stdin); fflush(stdin); // 입력 버퍼를 비운다. fputs("이름을 입력 하세요 : ", stdout); fgets(name, sizeof(name), stdin); printf("주민번호 앞자리 : %s\n", perID); printf("이 름 : %s\n", name); return 0; }
21-5 문자열 조작 함수 문자열의 길이를 반환하는 strlen 함수 문자열을 복사하는 함수 21-5 문자열 조작 함수 문자열의 길이를 반환하는 strlen 함수 문자열을 복사하는 함수 #include <stdio.h> size_t strlen(const char* s) 성공 시 0, 실패 시 EOF 리턴 #include <string.h> char* strcpy(char* dest, const char* src); char* strncpy(char* dest, const char* src, size_t n); 리턴 시 복사된 문자열의 포인터 리턴
21-5 문자열 조작 함수 /* strlen.c */ #include <stdio.h> 21-5 문자열 조작 함수 /* strlen.c */ #include <stdio.h> #include <string.h> int main(void) { char str[100]; while(1){ fgets(str, sizeof(str), stdin); printf("문자열의 길이 : %d \n", strlen(str)); } return 0;
21-5 문자열 조작 함수 문자열을 추가하는 함수 그림 21-5 #include <string.h> 21-5 문자열 조작 함수 문자열을 추가하는 함수 #include <string.h> char* strcat(char* dest, const char* src); char* strncat(char* dest, const char* src, size_t n); 리턴 시 추가된 문자열의 포인터 리턴 그림 21-5
21-5 문자열 조작 함수 /* strcat.c */ #include <stdio.h> 21-5 문자열 조작 함수 /* strcat.c */ #include <stdio.h> #include <string.h> int main(void) { char str1[30]="Your favorite language is "; // null 문자 포함 27문자. char str2[10]; fputs("What is your favorite computer lanaguage ? : ", stdout); fgets(str2, sizeof(str2), stdin); strcat(str1, str2); printf("생성된 문자열 : %s \n", str1); return 0; }
21-5 문자열 조작 함수 문자열을 비교하는 함수 표 21-2 리턴 값 의미 0보다 큰 값(양수) 21-5 문자열 조작 함수 문자열을 비교하는 함수 #include <string.h> int strcmp(const char* s1, const char* s2); int strncmp(const char* s1, const char* s2, size_t n); 리턴 시 추가된 문자열의 포인터 리턴 리턴 값 의미 0보다 큰 값(양수) str1이 str2 보다 큰 경우 str1과 str2가 완전히 같은 경우 0보다 작은 값(음수) str1이 str2 보다 작은 경우 표 21-2
21-5 문자열 조작 함수 /* strcamp.c */ #include <stdio.h> 21-5 문자열 조작 함수 /* strcamp.c */ #include <stdio.h> #include <string.h> char* str1="ABC"; char* str2="ABD"; int main (void) { int result; result=strcmp(str1, str2); if(result>0) puts("str1이 str2보다 큽니다 "); else if(result<0) puts("str2가 str1보다 큽니다"); else puts("두 문자열이 정확히 같습니다"); return 0; }
21-5 문자열 조작 함수 문자열을 숫자로 변환하는 함수들 대소문자의 변환을 처리하는 함수들 21-5 문자열 조작 함수 문자열을 숫자로 변환하는 함수들 대소문자의 변환을 처리하는 함수들 #include <stdlib.h> int atoi(char *ptr); // 문자열을 int형 데이터로 변환 long atol(char *ptr); // 문자열을 long형 데이터로 변환 double atof(char *str); // 문자열을 double형 데이터로 변환 #include <ctypes.h> int toupper(int c); // 소문자를 대문자로 int tolower(int c); // 대문자를 소문자로