C에서 getchar 함수 사용

Jinku Hu 2023년10월12일
  1. getchar함수를 사용하여 C의 표준 입력 스트림에서 단일 문자 읽기
  2. getchar함수를 사용하여 C에서 문자열 입력 읽기
C에서 getchar 함수 사용

이 기사에서는 C에서getchar함수를 사용하는 방법에 대한 여러 방법을 보여줍니다.

getchar함수를 사용하여 C의 표준 입력 스트림에서 단일 문자 읽기

getchar함수는 C 라이브러리에 포함 된 표준 입출력 유틸리티의 일부입니다. fgetc, getc, fputc또는putchar와 같은 문자 입력 / 출력 작업을위한 여러 기능이 있습니다. fgetcgetc는 기본적으로 동일한 기능을 가지고 있습니다. 파일 스트림 포인터를 사용하여 문자를 읽고int유형으로 캐스트 된unsigned char로 리턴합니다.

getchar는 문자를 읽을 인수로stdin파일 스트림을 암시 적으로 전달하는getc의 특정 케이스입니다. 따라서getchar는 인수를 취하지 않고int유형으로 캐스트 된 읽기 문자를 리턴합니다. 다음 예에서는 단일 문자를 입력하고putchar함수로 인쇄하는 기본 시나리오를 보여줍니다.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int ch;

  printf("Please, input a single character: ");
  ch = getchar();
  putchar(ch);

  exit(EXIT_SUCCESS);
}

getchar함수를 사용하여 C에서 문자열 입력 읽기

또는 새 줄 또는EOF가 나타날 때까지 문자열 입력을 읽고 미리 할당 된char버퍼에 저장하는 루프를 구현할 수 있습니다. 하지만이 메서드는 동일한 기능을 구현하는 라이브러리 함수 인gets또는getline에 대한 호출에 비해 성능 오버 헤드를 추가합니다. 솔루션의 주요 부분은getchar함수에서 반환 된 값이 줄 바꾸기 문자 또는EOF와 같지 않을 때까지 실행되는while루프입니다.

이 경우 20 자 크기의char배열을 임의로 할당했습니다. 반복 할 때마다 배열의 첫 번째 요소에 대한 포인터가 구현되고getchar의 반환 값이 할당됩니다. 마지막으로printf함수 호출로 버퍼를 출력합니다.

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void) {
  char buf[SIZE];
  char *p;
  int ch;

  p = buf;
  printf("Please, provide input: ");
  while ((ch = getchar()) != '\n' && ch != EOF) {
    *p++ = (char)ch;
  }
  *p++ = 0;
  if (ch == EOF) {
    printf("EOF encountered\n");
  }

  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

출력:

Please, provide input: string longer than 20 characters
string longer than 20 characters

이전 예제 코드는 일반적으로 잘 작동 할 수 있지만 버퍼 오버플로 버그 또는 비정상적인 프로그램 종료를 초래할 수있는 몇 가지 오류가 있습니다. 새 줄 또는EOF가 나타날 때까지 사용자 입력을 처리하기 때문에 고정 크기char버퍼에 맞을 것이라는 보장은 없습니다. 고정 버퍼를 사용해야하는 경우 입력 크기의 개수를 유지하고 용량에 도달 한 후 버퍼에 저장하는 것을 중지 할 책임이 있습니다.

이전 코드에서이 문제를 해결 한 후% s지정자를 사용하여 버퍼 내용을 인쇄하는printf문을 처리해야합니다. 입력 문자열의 마지막 문자가 널 바이트라는 보장이 없으므로printf호출은 사용자 자신이 버퍼 끝에 널 바이트를 삽입하지 않는 경우 중지 할 위치를 알지 못합니다. 다음 샘플 코드는 이전 오류를 수정하고 더 나은 데모를 위해 몇 줄을 추가합니다.

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void) {
  char buf[SIZE];
  int ch;
  size_t index = 0;
  size_t chars_read = 0;

  printf("Please, provide input: ");
  while ((ch = getchar()) != '\n' && ch != EOF) {
    if (index < sizeof(buf) - 1) {
      buf[index++] = (char)ch;
    }
    chars_read++;
  }
  buf[index] = '\0';
  if (ch == EOF) {
    printf("EOF encountered\n");
  }
  if (chars_read > index) {
    printf("Truncation occured!\n");
  }

  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

출력:

Please, provide input: string longer than 20 characters
Truncation occured!
string longer than
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C Char