cyphen156
Chapter2 C언어의 자료형과 표준 입출력 함수 본문
C언어의 자료형
데이터 타입 | 일반 32 비트 | 인텔 IA-32 | x86-64 | |
문자 | char | 1 | 1 | 1 |
정수 | short | 2 | 2 | 2 |
int | 4 | 4 | 4 | |
long | 4 | 4 | 8 | |
long long | 8 | 8 | 8 | |
부동 소수 | float | 4 | 4 | 4 |
double | 8 | 8 | 8 | |
long double | 16 | 8 | 8 |
표준 입출력 함수(Standard Input/Output)
C언어에서 표준 입출력 함수를 사용하려면 미리 정의된 함수들이 있는 라이브러리를 불러와야 사용할 수 있다.
#include <stdio.h>를 하는 이유가 이 때문이다. Standard Input/Output library라는 헤더파일을 불러와 사용하겠다는 의미이다.
만약 stdio.h를 #include하지 않은채 빌드를 하려 한다면 비주얼 스튜디오는 에러메세지를 출력해준다.
Stdio.h는 주로 파일을 읽거나 쓰고, 콘솔과 버퍼의 입출력에 관련된 함수가 정의되어 있다.
대표 파일 관련 조작 함수
- fopen() : 파일을 읽어오거나 쓰기한다.
- fclose() : 파일을 닫는다
- remove() : 파일을 삭제한다
- rename() : 파일 이름을 재정의한다.
- tmpfile() : 임시 파일을 만들어 열고 쓴다.
대표 콘솔 입출력 함수
- printf() : 표준 출력 함수, 콘솔 창에 내용을 출력해준다.
- scanf() : 표준 입력 함수, 사용자로부터 내용을 입력받는다.
- getchar() : 주어진 스트림(주로 버퍼)으로 부터 문자 하나를 읽고 리턴한다.
- gets() : 주어진 스트림(주로 버퍼)으로 부터 문자열을 읽고 리턴한다.
- putchar() : 스트림(주로 버퍼)에 문자 하나를 쓴다.
- puts() : 스트림(주로 버퍼)에 문자열을 쓴다.
- fflush() : 보류 중인 버퍼된 출력을 주어진 스트림의 파일에 강제로 쓴다. -> 버퍼를 비워준다고 생각하면 된다.
- setbuf() : 스트림을 버퍼링 모드로 변환한다.
// 함수이름 앞에 f를 붙이면 파일에 쓰는 함수가 된다.
대표 멤버 상수
- EOF : End Of File, 파일의 끝을 의미하는 int형 음의 정수(-1)
- BUFSIZ : setbuf()함수에 의해 버퍼 크기를 나타내는 정수
- NULL : 아직 아무 내용도 입력받지 않았다는 것을 의미하는 NULL Pointer의 약자/변수를 초기화 하지 않았다는 의미로도 사용한다.
멤버 변수
- stdin : 표준 입력 스트림을 참조하는 file에 대한 포인터
- stdout : 표준 출력 스트림을 참조하는 file에 대한 포인터
- stderr : 표준 오류 스트림을 참조하는 file에 대한 포인터
자세한 내용은 stdio.h - 위키백과, 우리 모두의 백과사전 (wikipedia.org)을 참고해 주세요.
형식지정자
표준입출력함수를 사용할 때 사용되는 변수의 형식
형식지정자가 여러개 나올 경우 순서대로 대입한다. ("%d%f%p", num1, num2, &num3)
예를 들어 printf("%d %s", 10, "바나나");는 콘솔창에 "10 바나나"를 출력한다.
형식지정자 | 의미 |
%d | 10진수 |
%ld | long형 10진수 |
%lld | long long형 10진수 |
%u | unsinged Int/양의 정수 |
%f | float |
%lf | double |
%x(X) | 16진수/대문자 |
%e(E) | 지수형/대문자 |
%c | 문자 하나 |
%s | 문자열 |
%p | 포인터 |
printf()함수
printf문 내부를 보면 %25.4lf라는 형식이 보인다.
이는 형식지정자를 통해 문자열 25개를 오른쪽부터 채워
소숫점 4자리수까지를 출력하고 남는 자리는 " "(space)를 채워 넣겠다는 의미이다.
만약 %-25.4lf라면 문자열 25개를 왼쪽부터 채워
소숫점 4자리수까지 출력하고 남는 자리는 " "(space)를 채워 넣겠다는 의미이다.
scanf()함수
※scanf는 그냥 사용하려 하면 버퍼 오버플로우의 가능성이 존재하기 때문에 비주얼 스튜디오가 에러를 띄워 준다.
이를 방지하기 위해서는 scanf_s()함수를 사용하거나
소스코드 맨 윗줄에 #define CRT_SECURE_NO_WARNINGS를 선언해 전처리기를 통해 처리해주면 된다.
scanf()함수는 printf()함수와는 다르게 입력받은 값을 변수에 저장해야 하기 때문에 변수의 위치를 의미하는 주소연산자(&)를 꼭 써줘야 한다.
그런데 scanf를 쓰다 보면 아무것도 입력하지 않았는데 입력을 받게 되는 경우가 있다.
이는 버퍼에 "\n"이나 " "(공백문자)가 남아있기 때문이다.
이를 해결하기 위한 방법은 아래에서 후술하겠다.
스트림(Stream)
프로그램과 입출력 장치가 데이터를 주고 받기 위한 연결 통로, 채널이라고도 한다.
프로그램은 시랭되면 자동으로 세개의 스트림을 생성한다.
- stdin : 표준 입력 스트림/주로 키보드, 마우스, 파일과 연결된다.
- stdout : 표준 출력 스트림/주로 모니터, 프린터, 파일과 연결된다.
- stderr : 표준 에러 스트림/무조건 모니터로 연결된다.
컴퓨터의 입출력장치와 CPU 사이의 처리속도가 상당히 크기 때문에 이러한 속도 차이를 보완하고자 스트림에는 버퍼라는 임시 저장소가 사용된다.
scanf()함수의 입력 오류관련 해결법
scanf()함수 내부에서 처리하는 방법들
- scanf("%c%c%c", &ch1, &blank, &ch2) : 두번째 문자를 blank라는 임시 변수에 입력하고 버린다.
- scanf("%c%*c%c", &ch1, &ch2) : %*c는 해당 문자를 버퍼에서 제거하라는 의미이다.
- scanf("%c %c", &ch1, &ch2) : 입력 변수 사이에 " "(공백문자)를 모두 제거하고 다음 변수를 입력받으라는 의미이다.
다른 함수를 호출한 뒤 다시 입력받는 방법들
- getchar(); : 버퍼에서 문자를 하나 꺼내온다.
- fflush(stdin); : 버퍼에 남은 문자열을 강제로 꺼내온다.
- rewind(stdio); : 매개변수로 들어온 스트림을 초기화해준다.
- fgets(string, sizeof(string), stdin); : 다음 줄에 string[strlen(string-1)] = '\0'를 통해 강제로 NULL문자를 넣어준다.
//모든 예제 소스는 한빛 미디어홈페이지에서 찾으실 수 있습니다.
IT CookBook, 전공자를 위한 C 언어 프로그래밍 (hanbit.co.kr)
또는 cyphen156/Work-space: Studying (github.com)에서 찾으실 수 있습니다.
'프로그래밍 > C언어' 카테고리의 다른 글
Chapter3 과제 (0) | 2023.02.03 |
---|---|
Chapter3 변수와 상수, 대입문과 연산 (0) | 2023.02.01 |
Chapter2 과제 (0) | 2023.01.05 |
Chapter1 과제 (0) | 2022.12.22 |
Chapter1 C언어와 컴파일러 (0) | 2022.12.22 |