printf()
형식화된 문자 출력sprintf()
형식화된 데이터를 버퍼로 출력snprintf()
크기를 정한 후 형식화된 데이터를 버퍼로 출력scanf()
데이터 읽기 (stdin으로부터 입력받음)sscanf()
데이터 읽기 (char*로부터 입력받음)getchar()
사용자가 키보드로 입력한 문자/문자열에서 한 글자를 읽어 반환하는 함수표준입력장치(키보드)의 입출력버퍼(I/O buffer)를 사용하는데,
버퍼가 비어있으면 키보드 입력을 기다리고,
어떤 문자가 채워져있으면 그 문자를 읽어서 반환합니다.gets()
행 읽기putchar()
문자를 모니터화면(콘솔)에 출력puts()
단순히 문자열만 출력 + 자동 개행 (문자열 출력에만 특화되어 속도가 빠름)
scanf()
와 gets()
의 차이점
scanf()
는 공백, 줄바꿈, EOF를 만나면 입력을 받습니다.scanf()
는\n
(줄바꿈문자)를 가져오지 않고, 마지막에\0
(널문자)를 붙입니다.
gets()
는 공백을 입력 문자열의 일부로 간주하고, 줄바꿈과 EOF를 만나면 입력을 종료합니다.\n
까지 가져오고,\n
을\0
로 대체합니다.
- 문자열을 키보드로 입력할 때, 문자열은 변수에 들어가는 것이 아니라 버퍼에 들어갑니다.
- 그리고 버퍼에서 3가지 함수에 따라 버퍼에 들어있는 문자열을 가져옵니다. (
scanf()
gets()
fgets()
)- 우리가 하나의 프로그램에서 여러가지 입력함수를 이용해 문자열 입력을 여러 번 할때 문제가 발생할 수 있습니다.
scanf()
함수는\n
를 버퍼에 남기고 가기 때문에, 그 다음에 입력함수에 쓰인다면, 입력함수가 버퍼에 남아있는\n
만을 가져올 수도 있습니다.- 예시. 우리가
scanf()
함수를 통해 나이를 입력한다면20\n
이 버퍼에 들어가고,20
이 문자열에 들어가고,\n
이 버퍼에 남게 됩니다. 그 이후에 우리가gets()
함수를 통해 이름을 입력하고자 한다면, 입력이 되지 않고 버퍼에 남은\n
을 가져와 입력을 끝내므로, 이름을 저장하는 변수에는\0
만 남게 됩니다.
%d
%i
10진수 정수(4바이트) -> int
%ld
10진수 정수(8바이트) -> long
%f
실수형(4바이트) -> float
%lf
실수형(8바이트) -> double
%c
문자 -> char
%s
문자열 -> char
%p
포인터의 메모리 주소 -> void
%o
8진수 int
%x
16진수 int
%u
부호없는 10진수(4바이트) -> unsigned int
%lu
부호없는 10진수(8바이트) -> unsigned long
printf()
- 기능. 주어진 형식에 맞춘 문자열을 파일에 출력합니다.
- 헤더.
stdio.h
- 원형.
int printf(const char* format, arg-list..)
- 인수1.
const char* format
형식 지정자- 인수2.
arg-list
가변 인자로 여러 개의 파라미터를 쉼표로 엮어 지정합니다.- 반환1.
int
성공 시 파일에 출력된 글자 수를 리턴합니다.- 반환2.
int
에러 시 음의 정수를 리턴합니다.- 예제.
printf("%d", num);
sprintf()
- 기능. 배열 버퍼에 일련의 문자와 값의 형식을 지정하고 저장합니다.
printf()
함수와 유사하지만 출력의 대상이 파일이 아니라 배열입니다.- 헤더.
stdio.h
- 원형.
int sprintf(char* buffer, const char* format, arg-list..)
- 인수1.
char* buffer
출력값을 저장할 문자열 배열- 인수2.
const char* format
형식 지정자- 인수3.
arg-list
형식 지정자에 치환할 값들- 반환1.
int
성공 시 끝 NULL 문자를 계산하지 않고 배열에 작성된 바이트 수를 리턴합니다.- 반환2.
int
에러 시 음의 정수를 리턴합니다.- 예제.
char buf[128]; int len = sprintf(buf, "Hello, "); for (int i=0; i<5; i++) len += sprintf(buf + len, "%d", i); printf("%s\n", buf); //Hello, 01234
snprintf()
- 기능.
sprintf()
함수와 유사하지만 버퍼 크기를 고려하여 최대로 출력가능한 문자의 길이에 제한을 둡니다. 따라서 버퍼 오버플로우에 더 안전합니다.- 헤더.
stdio.h
- 원형.
int snprintf(char* buffer, size_t size, const char* format, arg-list..)
- 인수1.
char* buffer
출력값을 저장할 문자열 배열- 인수2.
size_t size
출력할 수 있는 최대 글자 수 제한. 일반적으로 버퍼의 크기로 지정합니다.- 인수3.
const char* format
형식 지정자- 인수4.
arg-list
형식 지정자에 치환할 값들- 반환1.
int
성공 시 끝 NULL 문자를 계산하지 않고 배열에 작성된 바이트 수를 리턴합니다.- 반환2.
int
에러 시 음의 정수를 리턴합니다.- 예제.
char buf2[20]; char str[] = "Hello, World!"; snprintf(buf2, strlen(str), "%s", str); printf("%s\n", buf2); //Hello, World snprintf(buf2, 10, "%s", str); printf("%s\n", buf2); //Hello, Wo
scanf()
- 기능. 표준 입력 파일로부터 형식화된 문자열을 읽어들입니다.
- 헤더.
stdio.h
- 원형.
int scanf(const char* format, arg-list..)
- 인수1.
const char* format
형식 지정자- 인수2.
arg-list
읽어들인 값을 저장할 포인터 리스트- 반환1.
int
성공 시 변환되고 지정된 필드 수를 리턴합니다. 리턴값은 읽히지만 지정되지 않은 필드를 포함하지 않습니다.- 반환2.
EOF(End of File)
변환이 수행되지 않은 경우, 파일의 끝에서 읽으려는 경우 리턴값은 EOF입니다. EOF는 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타냅니다. 실제 값은 -1을 나타냅니다.- 반환3.
0
지정된 필드가 없음을 의미합니다.- 예제.
int num; scanf("%d", &num); printf("%d\n", num);
sscanf()
- 기능. 지정한 문자열로부터 형식화된 문자열을 읽어들입니다.
- 헤더.
stdio.h
- 원형.
int sscanf(const char* buffer, const char* format, arg-list..)
- 인수1.
const char* bufffer
읽어들일 대상 문자열의 포인터- 인수2.
const char* format
형식 지정자- 인수3.
arg-list
읽어들인 값을 저장할 포인터 리스트- 반환1.
int
성공 시 변환되고 지정된 필드 수를 리턴합니다. 리턴값은 읽히지만 지정되지 않은 필드를 포함하지 않습니다.- 반환2.
EOF(End of File)
변환이 수행되지 않은 경우, 파일의 끝에서 읽으려는 경우 리턴값은 EOF입니다. EOF는 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타냅니다. 실제 값은 -1을 나타냅니다.- 반환3.
0
지정된 필드가 없음을 의미합니다.- 예제.
char buffer[256] = "name:do num:8 age:2"; char name[30]; int num, age; sscanf(buffer, "name:%s num:%d age:%d", name, &num, &age); //버퍼의 내용을 이름, 번호, 나이 변수에 설정 printf("이름:%s 번호:%d 나이:%d\n", name, num, age); //이름, 번호, 나이 출력
getchar()
- 기능. standard input(표준입력)으로부터 입력받은 문자를 반환합니다. 우리가 입력하는 표준 입력들을 바로 int 타입으로 하나씩 반환해줍니다. 현재 stream 위치에서 단일 문자를 읽고 stream 위치를 다음 문자로 이동합니다.
getc(stdin)
과 같으며, 읽기 모드에서 지원되지 않습니다.- 헤더.
stdio.h
- 원형.
int getchar(void)
- 인수.
- 반환1. 읽은 문자를 리턴합니다.
- 반환2. EOF의 리턴값은 오류 또는 파일의 끝 조건을 표시합니다. 오류 또는 파일의 끝 조건이 발생했는지 여부를 판별하기 위해
ferror()
또는feof()
함수를 사용합니다.- 예제.
char c = (char)getchar(); int cc = getchar(); printf("%c\n", getchar());
gets()
- 기능. 표준 입력 스트림 stdin으로부터 행을 읽고, buffer에 저장합니다. 행은 줄 바꾸기 문자(\n) 또는 EOF를 포함하지 않지만 해당 문자까지 모든 문자로 구성됩니다.
gets()
함수는 행을 리턴하기 전에, 읽은 경우 줄 바꾸기 문자를 null문자(\0)로 대체합니다.- 헤더.
stdio.h
- 원형.
char* gets(char* buffer)
- 인수.
char* buffer
- 반환1.
char*
성공 시 해당 인수의 문자열을 리턴합니다.- 반환2. 오류(또는 읽은 문자가 없는 파일의 끝 조건일시) NULL 값을 리턴합니다. 오류 또는 파일의 끝 조건이 발생했는지 여부를 판별하기 위해
ferror()
또는feof()
함수를 사용합니다. 오류가 있는 경우, buffer에 저장된 값이 정의되지 않습니다. 파일의 끝 조건이 발생하면, buffer가 변경되지 않습니다.- 예제.
char str[100]; //최대 99개까지 문자를 저장 ('\0'을 저장할 공간이 필요함) gets(str); //사용자에게 문자열을 입력 받습니다. (==gets(&str[0])) printf("%s\n", str); //사용자가 입력한 문자열을 출력합니다.
putchar()
- 기능. 매개변수로 들어온 문자 c를 standard output(표준출력)에 문자로 출력합니다. 매개변수의 데이터 타입이 int로 되어있는데, 이는 type casting에 의해 int 타입으로 인식을 해서 char 타입으로 변환해서 출력을 해주게 됩니다.
putc(c, stdout)
와 동일하며, 매크로로 정의할 수 있으므로 인수를 여러 번 평가할 수 있습니다.- 헤더.
stdio.h
- 원형.
int putchar(int c)
- 인수.
int
- 반환1. 성공 시 쓰여진 문자를 리턴합니다.
- 반환2. 오류 시 -1인 EOF를 리턴합니다.
- 예제.
int ch; printf("enter any value: "); //enter any value: 329032923 ch = getchar(); //////////////////// printf("\nvalue: "); putchar(ch); //value: 3 //////////////////// char ch2 = 'a'; putchar(ch2); //a putchar(80); //P putchar('P'); //P
puts()
- 기능. 입력 문자열을 출력합니다.
- 헤더.
stdio.h
- 원형.
int puts(const char* str)
- 인수.
const char* str
- 반환1. 성공 시 음수가 아닌 값을 리턴합니다.
- 반환2. 오류 시 -1인 EOF를 리턴합니다.
- 예제.
char str[10] = "asdf"; puts(str); //문자열을 출력합니다.