c언어 scanf 버퍼 관련 질문

조회수 696회
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE {
    struct NODE* prevlink;
    struct NODE* nextlink;
    char info;
}NODE;
void add(NODE* list, int r, char e) {
    int a;
    NODE* p;
    NODE* linker = list->nextlink;
    for (a = 1; a < r; a++) {
        linker = linker->nextlink;
    }
    p = (NODE*)malloc(sizeof(NODE));
    p->info = e;
    p->prevlink = linker->prevlink;
    p->nextlink = linker;
    linker->prevlink->nextlink = p;
    linker->prevlink = p;
}
void delete(NODE* list, int r) {
    int a;
    NODE* cur;
    cur = list->nextlink;
    for (a = 1; a < r; a++) {
        cur = cur->nextlink;
    }
    NODE* p1 = cur->prevlink, * p2 = cur->nextlink;
    p1->nextlink = p2;
    p2->prevlink = p1;
    free(cur);
}
void get(NODE* list, int r) {
    int a;
    NODE* p = list->nextlink;
    for (a = 1; a < r; a++) {
        p = p->nextlink;
    }
    printf("%c\n", p->info);

}
void print(NODE* list) {
    int a;
    NODE* p = list->nextlink;
    while (p->nextlink != NULL) {
        printf("%c", p->info);
        p = p->nextlink;
    }
    printf("\n");
}
int main() {
    int stepcount, totcount = 0, a, tmpint;
    char tmpchar, stepchar;
    NODE head, tail;
    head.nextlink = &tail;
    head.prevlink = NULL;
    tail.prevlink = &head;
    tail.nextlink = NULL;
    scanf(" %d", &stepcount);
    for (a = 0; a < stepcount; a++) {
        scanf(" %c", &stepchar);
        if (stepchar == 'A') {
            totcount++;
            scanf(" %d %c", &tmpint, &tmpchar);
            if (tmpint<1 || tmpint>totcount) {
                printf("%s", "invalid position\n");
                continue;
            }

            add(&head, tmpint, tmpchar);
        }
        else if (stepchar == 'D') {
            scanf(" %d", &tmpint);
            if (tmpint <1 || tmpint > totcount) {
                printf("%s", "invalid position\n");
                continue;
            }
            delete(&head, tmpint);
            totcount--;
        }
        else if (stepchar == 'P') {
            if (totcount <= 0) {
                printf("invalid position\n");
                continue;
            }
            print(&head);
        }
        else if (stepchar == 'G') {
            scanf(" %d", &tmpint);
            if (tmpint<1 || tmpint>totcount) {
                printf("invalid position\n");
                continue;
            }
        else
            printf("invalid position\n");
            get(&head, tmpint);
        }
    }
    return 0;
}

문제있는 구간만 잘라서 올리고 싶었는데 똑같은 구간이어도 예시에 따라 오류가 생길때도 있고 안 생길 때도 있어서 일단 싹 올렸습니다.

이중연결리스트 문젠데 여쭤보고 싶은건 그게 아니고 scanf부분을 지나갈때 %c를 받을때는 getchar로 버퍼를 넘겨줘야된다는건 알고 있는데 이 코드에서 %d만 받을때도 \n이 다음 scanf로 넘어가서 엉망이 되는 때가 있습니다.

처음에 그래서 그냥 모든 scanf 뒤에다가 getchar를 넣어보기도 했는데 이게 넣는 예시마다 넘어가는 때도 있고 안넘어가는 때도 있어서 안되고 또 fflush를 넣으면 이건 쓴거랑 안쓴거랑 다른게 없어서 문제가 해결이 안되더라구요.

그래서 인터넷 찾아봤더니 %앞에 빈칸을 하나 넣어주는 방법이 있다고 해서 코드 완성이랑 별개로 scanf관련 문제는 이걸로 해결됐는데 이게 이렇게 된 이유가 궁금합니다.

며칠 동안 찾아봤는데 방법이 없네요... %앞에 빈칸넣는것도 방법이 아닌지 oj도 통과 안되고...

1 답변

  • scanf를 이용해서 사용자 입력을 받을 때 유독 %c만 " %c"와 같이 앞에 한칸을 띄우는 이유를 이전 답변에서 제가 자세하게 적어 둔것이 있습니다.

    아래 글 읽어 보시면 이해 되실 거에요. 참고하세요.

    c언어 막 시작한 초보자입니다... 정수와 실수까지는 입력이 되는데 문자를 바료 입력 안받고 넘어가버립니다.. 이유가 뭘까요

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 위 코드에서 %앞에 빈칸을 없앤 후 예시를 몇개 넣어보면 %d 다음에 %d를 넣을때도 \n이 들어가는 경우가 있는데 혹시 그거 이유를 여쭤볼 수 있을까요? 박설 2021.4.11 00:18
    • %d 다음에 %d를 넣으면 '\n'이 들어가지 않습니다. 왜냐하면 %d라는 것이 십진수라는 뜻이기 때문에 입력 버퍼에서 10진수를 쉽게 찾을 수 있어요. %c인 경우에만 한글자 이기 때문에 '\n'을 글자로 인식하는 거에요. 따라서 댓글에서 질문하신 경우는 없을 것이구요. 아마 다른 이유가 있을 것 같네요. 알 수 없는 사용자 2021.4.11 00:33
    • 그리고 코드에 보니까 %d앞에도 한칸 띄운게 보이는데 그럴 필요없습니다. %c 앞에만 띄우시면 됩니다. 알 수 없는 사용자 2021.4.11 00:35

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

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

(ಠ_ಠ)
(ಠ‿ಠ)