Download presentation
Presentation is loading. Please wait.
1
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 21. 문자와 문자열 관련 함수
2
윤성우의 열혈 C 프로그래밍 Chapter 스트림과 데이터의 이동 윤성우 저 열혈강의 C 프로그래밍 개정판
3
무엇이 입력이고 무엇이 출력인가 입력장치 출력장치 윤성우의 열혈 C 프로그래밍 마우스 모니터 키보드 파일 화상 카메라 프린터
입출력 장치는 매우 포괄적이다. 데이터를 컴퓨터 내부로 받아들이는 것이 입력이고 외부로 전송하는 것이 출력이다.
4
데이터의 이동수단이 되는 스트림 윤성우의 열혈 C 프로그래밍 데이터의 입 출력이 가능한 이유!
콘솔 입출력을 위한 스트림은 프로그램이 시작되면 OS에 의해서 자동으로 생성된다. 데이터의 입 출력이 가능한 이유! 출력의 경로가 되는 출력 스트림과 입력의 경로가 되는 입력 스트림이 존재하기 때문 입출력 스트림이란? OS가 데이터의 입출력을 위해 놓아주는 소프트웨어적인 형태의 다리!
5
스트림의 생성과 소멸 윤성우의 열혈 C 프로그래밍
√ stdin과 stdout은 각각 표준 입력 스트림과 표준 출력 스트림을 의미하는 이름들이다. √ stderr은 표준 에러 스트림이라 하며, 출력의 대상은 stdout과 마찬가지로 모니터이다. √ 출력 리다이렉션이라는 것을 통해서 stdout과 stderr이 향하는 데이터 전송의 방향을 각각 달리 할 수 있다. √ stdin, stdout, stderr은 모두 프로그램 시작과 동시에 자동으로 형성되고 프로그램 종료시 자동으로 소멸된다. √ 이외의 스트림들은 프로그래머가 직접 형성해야 한다. 예를 들어 파일 입출력을 위한 스트림은 직접 형성해야 한다. 스트림이라 불리는 이유는 데이터의 이동을 한 방향으로만 형성하기 때문이다. 물이 한 방향으로 흐르듯 스트림도(스트림은 물의 흐름을 의미함) 한 방향으로만 데이터가 이동한다.
6
윤성우의 열혈 C 프로그래밍 Chapter 문자 단위 입출력 함수 윤성우 저 열혈강의 C 프로그래밍 개정판
7
문자 입출력 함수 윤성우의 열혈 C 프로그래밍 putchar 함수는 인자로 전달된 문자를 모니터에 출력한다.
√ 하나의 문자를 출력하는 두 함수 putchar 함수는 인자로 전달된 문자를 모니터에 출력한다. fputc 함수의 두 번째 인자를 통해서 출력의 대상을 지정한다. fputc의 두 번째 인자로 stdout이 전달되면 이 putchar 함수와 동일한 결과를 보인다. √ 하나의 문자를 입력 받는 두 함수 키보드로 입력된 문자의 정보를 반환한다. 문자를 입력 받을 대상정보를 인자로 전달한다. getchar 함수와 fgetc 함수의 관계는 putchar 함수와 fputc 함수의 관계와 같다.
8
문자 입출력 관련 예제 윤성우의 열혈 C 프로그래밍 실행결과
문자의 입력을 완성하는 엔터 키의 입력도 하나의 문자로 인식이 된다. 따라서 이 역시도 입출력이 가능하다. 실행결과 첫 번째 P는 입력이 된 P, 두 번째 P는 출력된 P 문자를 int형 변수에 저장하는 이유는 EOF를 설명하면서 함께 설명한다.
9
문자 입출력에서의 EOF 윤성우의 열혈 C 프로그래밍 실행결과 √ EOF의 의미
▶ EOF는 End Of File의 약자로서, 파일의 끝을 표현하기 위해서 정의해 놓은 상수이다. ▶ 파일을 대상으로 fgetc 함수가 호출되었을 때 파일에 끝에 도달을 하면 EOF가 반환된다. √ 콘솔 대상의 fgetc, getchar 함수호출로 EOF를 반환하는 경우 ▶ 함수호출의 실패 ▶ Windows에서 Ctrl+Z 키, Linux에서 Ctrl+D 키가 입력이 되는 경우 키보드에는 EOF가 존재하지 않는다. 따라서 EOF를 Ctrl+Z 키와 Ctrl+D 키로 약속해 놓은 것이다. 예제에서 보이듯이. 하나의 문장이 입력되어도 문장을 이루는 모든 문자들이 반복된 getchar 함수의 호출을 통해서 입력될 수 있다. 실행결과
10
반환형이 int이고, int형 변수에 문자를 담는 이유는?
윤성우의 열혈 C 프로그래밍 반환형이 int이고, int형 변수에 문자를 담는 이유는? √ 반환형이 char형이 아닌 int형인 이유는? ▶ char형은 예외적으로 signed char가 아닌 unsiged char로 표현하는 컴파일러가 존재한다. ▶ 파일의 끝에 도달했을 때 반환하는 EOF는 -1로 정의되어 있다. ▶ char를 unsigend char로 표현하는 컴파일러는 EOF에 해당하는 -1을 반환하지 못한다. ▶ int는 모든 컴파일러가 signed int로 처리한다. 따라서 -1의 반환에 무리가 없다.
11
윤성우의 열혈 C 프로그래밍 Chapter 문자열 단위 입출력 함수 윤성우 저 열혈강의 C 프로그래밍 개정판
12
문자열 출력 함수: puts, fputs 윤성우의 열혈 C 프로그래밍 실행결과
13
문자열 입력 함수: gets, fgets 윤성우의 열혈 C 프로그래밍
이 경우 입력되는 문자열의 길이가 배열을 넘어설 경우 할당 받지 않은 메모리를 참조하는 오류가 발생한다. stdin으로부터 문자열을 입력 받아서 str에 저장을 하되, 널 문자를 포함하여 sizeof(str)의 크기만큼 저장을 해라.
14
fgets 함수의 호출의 예 윤성우의 열혈 C 프로그래밍 실행결과1 엔터 엔터 실행결과2 실행결과3 엔터 엔터 엔터 엔터
6개의 문자씩 끊어서 읽히고 있다. 즉, 한번의 fgets 함수호출당 최대 6개의 문자만 읽혀진다. 엔터 엔터 실행결과2 실행결과3 엔터 키의 입력도 문자열의 일부로 받아 들임을 보임 공백을 포함하는 문자열을 읽어 들임을 보임 엔터 엔터 엔터 엔터
15
윤성우의 열혈 C 프로그래밍 Chapter 표준 입출력 버퍼 윤성우 저 열혈강의 C 프로그래밍 개정판
16
표준 입출력 기반의 버퍼와 버퍼링의 이유 윤성우의 열혈 C 프로그래밍 √ 입출력 버퍼 √ 입출력 버퍼에 데이터가 전송되는 시점
▶ 버퍼는 특정 크기의 메모리 공간을 의미한다. ▶ 운영체제는 입력과 출력을 돕는 입출력 버퍼를 생성하여 제공한다. ▶ 표준 입출력 함수를 기반으로 데이터 입출력 시 입출력 버퍼를 거친다. √ 입출력 버퍼에 데이터가 전송되는 시점 ▶ 호출된 출력함수가 반환이 되는 시점이 출력버퍼로 데이터가 완전히 전송된 시점이다. ▶ 엔터를 입력하는 시점이 키보드로 입력된 데이터가 입력버퍼로 전달되는 시점이다. 버퍼링을 하는 이유는 데이터 이동의 효율과 관련이 있다. 데이터를 모아서 전송하면, 하나씩 전송하는 것보다 효율적이다.
17
출력버퍼를 비우는 fflush 함수 윤성우의 열혈 C 프로그래밍 ▶ 인자에 해당하는 출력버퍼를 비운다.
출력버퍼를 비운다는 것은 출력버퍼에 저장된 데이터를 지우는 것이 아니라, 출력버퍼에 저장된 데이터를 목적지로 최종 전송함을 뜻한다. ▶ fflush(stdout) → 출력버퍼를 지워라! 출력버퍼의 경우와 달리 입력버퍼의 비움은 입력버퍼에 저장된 데이터의 소멸을 뜻한다. 그리고 fflush 함수는 출력버퍼를 대상으로 정의된 함수이다. 따라서 fflush(stdin) 과 같은 형태의 함수호출은 그 결과를 보장받지 못한다. 그렇다면 입력버퍼는 어떻게 비워야 할까?
18
입력버퍼는 어떻게 비워야 하나요? 윤성우의 열혈 C 프로그래밍 실행결과1 실행결과2
주민번호 앞 6자리만 입력 받기 위해서 배열의 길이가 널 문자 포함 7이다. 입력버퍼를 비우는 함수 실행결과1 엔터 키가 남아서 문제가 되는 상황 실행결과2 말 안 듣는 사람들 때문에 문제되는 상황 어떠한 경우에도 주민번호 6자리만 입력 받도록 재 구현된 예제
19
Chapter 21-5. 입출력 이외의 문자열 관련 함수
윤성우의 열혈 C 프로그래밍 Chapter 입출력 이외의 문자열 관련 함수 윤성우 저 열혈강의 C 프로그래밍 개정판
20
문자열의 길이를 반환하는 함수: strlen
윤성우의 열혈 C 프로그래밍 문자열의 길이를 반환하는 함수: strlen size_t의 일반적인 선언 typedef unsigned int size_t; typedef에 관해서는 후에 설명 마지막에 삽입되는 널 문자를 없애는 예제 실행결과
21
문자열을 복사하는 함수들: strcpy, strncpy
윤성우의 열혈 C 프로그래밍 문자열을 복사하는 함수들: strcpy, strncpy 대표적인 문자열 복사 함수 str1에 저장된 문자열을 str2에 단순히 복사! str1에 저장된 문자열을 str2에 복사하되 최대 sizeof(str2)의 반환 값 크기만큼 복사한다. strcpy 함수를 호출하는 경우 배열의 범위를 넘어서 복사가 진행될 위험이 있다.
22
strncpy 함수를 잘못 사용한 예 윤성우의 열혈 C 프로그래밍 실행결과
23
문자열을 덧붙이는 함수들: strcat, strncat
윤성우의 열혈 C 프로그래밍 문자열을 덧붙이는 함수들: strcat, strncat strncat 함수는 덧붙일 문자열의 최대 길이를 제한한다. 최대 n개의 문자를 덧붙이되 널 문자 포함하여 n+1개의 문자를 덧붙인다. 실행결과 덧붙여지는 방식
24
문자열을 비교하는 함수들: strcmp, strncmp
윤성우의 열혈 C 프로그래밍 문자열을 비교하는 함수들: strcmp, strncmp strncmp는 최대 n개의 문자를 비교 ▶ 크고 작음은 아스키코드 값을 근거로 한다. ▶ A보다 B가, B보다 C가 아스키 코드 값이 더 크고 A보다 a가 , B보다 b가 아스키 코드 값이 더 크니, 사전편찬순서를 기준으로 뒤에 위치할 수록 더 큰 문자열로 인식해도 된다. 0보다 큰 값이 출력 0보다 작은 값이 출력 두 문자열이 같으면 0, 다르면 0이 아닌 값을 반환한다고 인식하고 있어도 충분하다!
25
윤성우의 열혈 C 프로그래밍 문자열 비교의 예 실행결과
26
그 이외의 변환함수들 윤성우의 열혈 C 프로그래밍 실행결과
헤더파일 stdlib.h에 선언 위의 함수들을 모른다면 문자열에 저장된 숫자 정보를 int형 또는 double형으로 변환하는 일은 번거로운 일이 될 수 있다. 실행결과
27
Chapter 21이 끝났습니다. 질문 있으신지요?
Similar presentations