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
-
댓글 입력