CHANGEL
SOLID BASICS
CHANGEL

공지사항

  • DEV.CHANGEL PROFILE
  • SOLID BASIC (289)
    • 공부 STUDY (115)
      • JAVA (57)
      • C | C++ (34)
      • CS (11)
      • MySQL (2)
      • ALGORITHM (1)
      • HTML (2)
      • CSS (2)
      • JS (2)
      • CODING (0)
      • MINI PROJECT (3)
    • 스프링 SPRING (21)
      • [SPRING] 김영한 스프링 입문 (11)
      • [SPRING] 남궁성 스프링의 정석 (1)
      • [SPRING] 스프링 핵심원리 (9)
    • 전공 수업 CS (65)
      • Computer Network (13)
      • algorithms (21)
      • Computer Architecture (7)
      • Software Engineering (4)
      • Data Structure (2)
      • DataBase (1)
      • Digital Engineering (14)
      • Discrete Mathematics (3)
      • Introduction to programming (0)
      • Mobile Software (0)
      • Intelligence and Informatio.. (0)
    • 대외활동 (35)
      • 신한은행 대학생 홍보대사 34기 (8)
      • SKT T프렌즈 5기 (13)
      • SK DEVOTION YOUNG 1기 (9)
      • 성균관 대학교 공학교육혁신센터 수강 (3)
      • 수상 기록 (1)
    • 솝트 33기 안드로이드 (7)
      • [솝트 33기] 회고록 (0)
      • [솝트 33기] 안드로이드 왕초보 스터디 (2)
      • [솝트 33기] 코틀린 스터디 (0)
      • [솝트 33기] Git을 털어보자 깃털 스터디 (4)
    • 멋쟁이사자처럼 11기 (6)
      • 멋사 회고록 (4)
      • 백엔드 세션 (1)
      • 기획 세션 (1)
      • 연합해커톤 운영단 (기획팀) (0)
    • 백준 BAEKJOON (16)
    • 독서 BOOK (10)
    • 자격증 CERTIFICATE (1)
    • 준비 서류 및 회고록 MEMOIR (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

최근 댓글

인기 글

CHANGEL

SOLID BASICS

공부 STUDY/C | C++

[C언어] 헷갈리는 getchar() 함수 이해하기

2022. 11. 24. 00:32

전공수업 C 언어 문자열 단원을 공부하던 중 getchar() 함수의 버퍼 개념에 대해 확실히 알고자 글을 정리한다.

getchar()

버퍼에 데이터가 있을 때 = > 버퍼 가장 앞의 데이터를 반환한다

 

버퍼에 데이터가 없을 때  = > 엔터(‘\n’)가 올 때까지 사용자로부터 문자를 받아서 버퍼에 저장하고

가장 앞의 데이터를 반환한다 < 만약 문자가 ‘1’ 이면 버퍼에는 ‘1’과 ‘\n’이 들어갔다가 ‘1’이 리턴된다.>

 

이때, 버퍼는 <문자형 큐>라고 생각하면 된다.

getchar()함수를 연속으로 썼을 때 오류가 생긴다면 버퍼의 데이터 문제일 가능성이 크다.

 

 
int main(void) {
char s1;
getchar();
s1=getchar();
}

처음 getchar()에서 ‘h’입력 => 버퍼에 ‘\n’이 남음 => 두 번째 getchar()에서 ‘\n’이 나가고 s1에 저장 =>

이러한 상황을 인지하지 못 하면 혼동이 생길 수 있다.

 

따라서 getchar()를 하고 변수에 저장하지 않고 이어서 getchar()를 쓸 것이라면 사용 전에 초기화해주어야 한다.

 

버퍼 초기화 하는 법 =>

 
while (getchar() != '\n') {}
// 함수가 버퍼의 '\n'을 반환할 때까지 반복한다.
(버퍼에 h|i|m|\n이 있었다면 => \n을 반환할 때 while조건 불충족 
=> 결국 버퍼가 초기화되고 while문이 끝나게 된다.)

예제 1)

int main(void) {
char s1;
getchar();
getchar();
s1 = getchar();
printf("%c", s1);
}
 

만약 사용자가 ‘h’를 입력했으면 첫 번째 getchar()에서 ‘h’가 반환되고, 두 번째 getchar()에서 ‘\n’이 반환된다.

그 후 버퍼가 비었으니 세 번째 getchar()에서 사용자 입력을 받고 맨 처음 데이터를 반환해서 s1에 저장한다.

이후 s1을 출력한다.

 

'공부 STUDY > C | C++' 카테고리의 다른 글

[C] 동적 메모리 | malloc(), calloc(), realloc() 함수를 이용한 동적 메모리 할당  (1) 2022.11.29
[C] 메모리 구조 | 스택, 힙, 데이터영역 | stack, Heap, Data  (0) 2022.11.29
[C언어] 포인터 헷갈리는 개념 정리  (0) 2022.11.22
[C언어] 다음 변환 지정자에 해당하는 'scanf_s' 에 대한 정수 인수가 없습니다  (0) 2022.10.01
혼공C | 완독 성공  (0) 2022.08.07
    '공부 STUDY/C | C++' 카테고리의 다른 글
    • [C] 동적 메모리 | malloc(), calloc(), realloc() 함수를 이용한 동적 메모리 할당
    • [C] 메모리 구조 | 스택, 힙, 데이터영역 | stack, Heap, Data
    • [C언어] 포인터 헷갈리는 개념 정리
    • [C언어] 다음 변환 지정자에 해당하는 'scanf_s' 에 대한 정수 인수가 없습니다
    CHANGEL
    CHANGEL
    NOT GIVING UP | SOLID BASICS

    티스토리툴바