while문이 이상하게 돌아갑니다 scanf

조회수 766회
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100  // 전역 변수 선언
char stack[MAX_STACK_SIZE];
int top = -1;        
void stackFull() {
    fprintf(stderr, "Stack is full, cannot add element");
    exit(1);
}
void stackEmpty() {
    fprintf(stderr, "Stack is Empty");
    exit(1);
}
void push(char a)
{
    if (top >= MAX_STACK_SIZE - 1)
        stackFull();
        stack[++top] = a;  
}
char pop(char a)
{
    if (top == -1)
        stackEmpty();
    return stack[top--];
}
void showStack() // 스택에 있는 값들을 출력
{
    int i;
    if (top == -1) printf("스택에 저장된 값이 없습니다.\n");
    else {
        printf("스택에 저장된 값 목록\n");
        for (i = 0; i < top+1; i++) {
            printf("%03d : %c\n", i + 1, stack[i]);
        }
        printf("%d개의 값이 저장되어 있습니다.\n",top);
    }
}
void main()
{
    int select=0;
    char a;
    while (select != 4) {
        printf("\n1. 스택에 값 넣기\n");
        printf("2. 스택에서 값 꺼내기\n");
        printf("3. 스택에 저장된 값 확인\n");
        printf("4. 종료\n\n");
        printf("입력 : ");
        scanf_s("%d", &select); 
        switch (select) {
        case 1: // 입력한 값을 스택에 저장한다.
            printf("저장할 값을 입력하세요 : ");
            a = getchar();
            push(a);
            break;
        case 2: // 스택에 저장된 정수값을 가져온다.
            printf("가져온 값 : %c", pop(a));
            break;
        case 3: // 스택에 저장된 값들을 보여준다.
            showStack();
            break;
        }
    }
}

이코드가 제가 생각하던 while문처럼 돌아가지 않고 한단계식 건너 뛰는 느낌으로 진행되네요 틀린것도 없는 것같은데 뭐가 문제일까요

1 답변

  • scanf 버퍼문제라고 검색해 보면 많은 글이 있습니다.

    scanf 에서 입력받고, 입력버퍼에 개행문자가 남아 있어서, 바로 다음에 getchar 부분으로 넘어가면, 저장할 값 입력에 개행문자( \n) 가 입력으로 들어가고, 다음 메뉴로 넘어가게 됩니다.

    아주 간단한 해결방법은 scanf 다음에 남아있는 개행문자를 getchar 로 받아서 한번 비워주는 것입니다.

    scanf_s("%d", &select);
    getchar();             // <===== !!!
    
    switch(select) {
    // ...
    

    그리고, 스택 입력값을 받을 때 getchar 로 받기 때문에, 한문자 이상을 받지 않아요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)