2-1 기본 입출력

do·2022년 3월 7일
0

API

목록 보기
5/42

요약

  • 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

기본 입출력 함수

1. printf()

  • 기능. 주어진 형식에 맞춘 문자열을 파일에 출력합니다.
  • 헤더. stdio.h
  • 원형. int printf(const char* format, arg-list..)
  • 인수1. const char* format 형식 지정자
  • 인수2. arg-list 가변 인자로 여러 개의 파라미터를 쉼표로 엮어 지정합니다.
  • 반환1. int 성공 시 파일에 출력된 글자 수를 리턴합니다.
  • 반환2. int 에러 시 음의 정수를 리턴합니다.
  • 예제.
printf("%d", num);

2. 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

3. 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

4. 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);

5. 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);	//이름, 번호, 나이 출력

6. 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());

7. 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);	//사용자가 입력한 문자열을 출력합니다.

8. 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

9. puts()

  • 기능. 입력 문자열을 출력합니다.
  • 헤더. stdio.h
  • 원형. int puts(const char* str)
  • 인수. const char* str
  • 반환1. 성공 시 음수가 아닌 값을 리턴합니다.
  • 반환2. 오류 시 -1인 EOF를 리턴합니다.
  • 예제.
char str[10] = "asdf";
puts(str);	//문자열을 출력합니다.

주소록 프로그램



0개의 댓글