cyphen156

Chapter2 C언어의 자료형과 표준 입출력 함수 본문

프로그래밍/C언어

Chapter2 C언어의 자료형과 표준 입출력 함수

cyphen156 2023. 1. 4. 15:00

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