풀면서 뜬금없이 scanf에서 애 먹었던 문제이다 ㅡㅡ



코드에 대한 세부적인 설명은 코드에 주석으로 달아놨습니당~!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Node {
    char data;
    struct Node *left;
    struct Node *right;
}node;
 
//노드생성 함수
node* Create(char x) {
    node* newNode = (node*)malloc(sizeof(node));
 
    newNode->left = NULL;
    newNode->right = NULL;
    newNode->data = x;
 
    return newNode;
}
 
void preorder(node* t) {
    if (t == NULL)
        return;
    
    printf("%c", t->data);
    preorder(t->left);
    preorder(t->right);
}
 
void inorder(node* t) {
    if (t == NULL)
        return;
    
    inorder(t->left);
    printf("%c", t->data);
    inorder(t->right);
}
 
void postorder(node* t) {
    if (t == NULL)
        return;
    
    postorder(t->left);
    postorder(t->right);
    printf("%c", t->data);
}
 
int main() {
    node * root[27];
    int num;
    char a, b, c, arr[81][2];
 
    scanf("%d"&num);
    
    for (int i = 0; i < num; i++) {
        //노드갯수와 각 노드의 자식노드를 입력받아 arr배열에 저장
        scanf(" %c %c %c"&a, &b, &c);
        arr[i][0= b;    arr[i][1= c;
        //num개의 노드 각각 생성
        root[i] = Create(a);
    }
 
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            //arr배열의 0번째 열에 저장된 값은 노드의 왼쪽 자식 노드가 된다.
            //배열에 저장된 값과 노드의 데이터(root->data)가 같을 때 그 노드를 왼쪽 자식노드로 저장 
            if (arr[i][0== root[j]->data)
                root[i]->left = root[j];
            //arr배열의 1번째 열에 저장된 값은 노드의 오른쪽 자식 노드가 된다.
            //배열에 저장된 값과 노드의 데이터(root->data)가 같을 때 그 노드를 오른쪽 자식노드로 저장 
            if (arr[i][1== root[j]->data)
                root[i]->right = root[j];
        }
    }
 
    preorder(root[0]);
    printf("\n");
    inorder(root[0]);
    printf("\n");
    postorder(root[0]);
 
    return 0;
}
cs


문제를 풀 때 57번째 줄인 scanf(" %c %c %c", &a, &b, &c);를 첫번째 %c앞에 공백 없이 scanf("%c %c %c", &a, &b, &c); 와 같은 방식으로 써주었더니 에러가 났다. 

이유를 찾아보았다. 컴퓨터는 Enter값도 입력값으로 받아들여서 버퍼에 Enter값이 추가된다고 한다. 그렇기 때문에 내가 사용한 코드는 scanf를 for문으로 반복했기 때문에 Enter값이 다음 scanf의 %c에 입력이 되는 것이다. 그런데 %c앞에 공백을 주면 구분자로 간주하여 오류가 생기지 않는다고 한다. 


문제 푸는 당시에 도저히 해결이 안돼서 게시판에 질문까지 올렸당 ㅠㅠ 나중에라도 또 이런식으로 갈팡질팡할 상황이 올 것 같아서 정리해 보았다... 아래는 내가 올렸던 질문에 대해 받았던 답변이다.



<<줄 바꿈 정의>>

carriage return(\r) : 현재의 위치를 나타내는 커서의 위치를 앞으로 이동한다.

line feed(\n) : 현재 위치에서 바로 아래로 이동한다.

윈도우에서 사용하는 Enter은 CR+LF가 된다.


+ Recent posts