C에서 getchar 함수 사용
이 기사에서는 C에서getchar
함수를 사용하는 방법에 대한 여러 방법을 보여줍니다.
getchar
함수를 사용하여 C의 표준 입력 스트림에서 단일 문자 읽기
getchar
함수는 C 라이브러리에 포함 된 표준 입출력 유틸리티의 일부입니다. fgetc
, getc
, fputc
또는putchar
와 같은 문자 입력 / 출력 작업을위한 여러 기능이 있습니다. fgetc
및getc
는 기본적으로 동일한 기능을 가지고 있습니다. 파일 스트림 포인터를 사용하여 문자를 읽고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
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