2010-03-22 9 views
1

저는 C에서 매우 익숙합니다. C에서 숫자와 문자열을 저장 한 다음이 예에서이를 인쇄합니다.설명은 마지막으로 입력 한 것에 대해서만 인쇄됩니다.

1 : Bread 
2 : WashingUpLiquid 
etc. 

내가 지금까지 가지고있는 코드는 다음과 같습니다 순간

#include <stdio.h> 
#include <stdlib.h> 
#define LENGTH 300 

struct node { 
int data; 
char * definition; 
struct node *left; 
struct node *right; 
}; 

struct node *node_insert(struct node *p, int value, char * word); 

void print_preorder(struct node *p); 

int main(void) { 
    int i = 0; 
    int d = 0; 
    char def[LENGTH]; 
    struct node *root = NULL; 

    for(i = 0; i < 2; i++) 
    { 
    printf("Please enter a number: \n"); 
    scanf("%d", &d); 
    printf("Please enter a definition for this word:\n"); 
    scanf("%s", def); 
    root = node_insert(root, d, def); 
    printf("%s\n", def); 
    } 

    printf("preorder : "); 
    print_preorder(root); 
    printf("\n"); 

    return 0; 
} 

struct node *node_insert(struct node *p, int value, char * word) { 
    struct node *tmp_one = NULL; 
    struct node *tmp_two = NULL; 

    if(p == NULL) { 
    p = (struct node *)malloc(sizeof(struct node)); 
    p->data = value; 
    p->definition = word; 
    p->left = p->right = NULL; 
    } 
    else { 
    tmp_one = p; 
    while(tmp_one != NULL) { 
     tmp_two = tmp_one; 
     if(tmp_one->data > value) 
     tmp_one = tmp_one->left; 
     else 
     tmp_one = tmp_one->right; 
    } 

    if(tmp_two->data > value) { 
     tmp_two->left = (struct node *)malloc(sizeof(struct node)); 
     tmp_two = tmp_two->left; 
     tmp_two->data = value; 
     tmp_two->definition = word; 
     tmp_two->left = tmp_two->right = NULL; 
    } 
    else { 
     tmp_two->right = (struct node *)malloc(sizeof(struct node)); 
     tmp_two = tmp_two->right; 
     tmp_two->data = value; 
     tmp_two->definition = word; 
     tmp_two->left = tmp_two->right = NULL; 
    } 
    } 

    return(p); 
} 

void print_preorder(struct node *p) { 
    if(p != NULL) { 
    printf("%d : %s\n", p->data, p->definition); 
    print_preorder(p->left); 
    print_preorder(p->right); 
    } 
} 

int의 만 설명 부분은 마지막 입력에 대한 출력한다 위해 작동하는 것 같다. char 배열의 포인터와 관련이 있다고 가정하지만 작동시키지 않아도됩니다. 어떤 아이디어 또는 조언?

답변

1

문제는 문자열에 대해 동일한 버퍼를 사용하고 있다는 것입니다. struct가 char에 대한 포인터를 가지고 있고, 매번 같은 포인터를 그 포인터와 동일한 값으로 전달하고 있음을 주목하십시오.

버퍼에서 scanf을 호출하면 포인터 자체가 아닌 포인터가 가리키는 데이터가 변경됩니다.

구조체에 할당하기 전에이 문제를 해결하려면 strdup을 사용할 수 있습니다. 그래서 코드의 라인은

tmp_*->definition = strdup(word); 

그렇지 않으면 당신은 누출이있을 것이다, 당신이 그것으로 완료되면에서는 StrDup에 의해 반환되는 char 배열을 해제해야 명심 될 것입니다.

+0

그게 다 :) :) 대단히 고마워, 정말 짜증나! – Paul

+0

옆에있는 녹색 체크를 클릭하여 수락 할 답변을 선택해야합니다. 그러면 질문에 대한 답변이 시스템에 전달되고 답변자와 평판도 제공됩니다. –

2

당신은 항상 def로 scanf를 수행하고 그 포인터를 def에 저장하는 삽입 루틴으로 전달합니다. 따라서 모든 항목이 def 버퍼를 가리 키므로 모든 버퍼는 해당 버퍼에 저장된 마지막 문자열을 가리 킵니다.

문자열을 복사하고 복사본에 대한 포인터를 이진 트리 노드에 놓아야합니다.

관련 문제