inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

c언어 문자열 출력에서 쓰레기 값 발생

492

노진수

작성한 질문수 1

0

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct element {  //여기에 이름 뜻
    char name[100];
    char mean[100];
}element;

typedef struct ListNode { //그리고 다음
    element data;
    struct ListNode* link;
}ListNode;

void error(char* message) {
    fprintf(stderr, "%s\n", message);
    exit(1);
}

void displaymenu()
{
    printf("\n*** 단어 사전 ***\n");
    printf("(1) 추가\n");
    printf("(2) 삭제\n");
    printf("(3) 출력\n");
    printf("(4) 종료\n");
    printf("---------------\n");
    printf("선택하세요 : ");
}

ListNode* search_mean(ListNode* head, element x) {
    ListNode* searched = head;
    printf("뜻을 찾을 단어 : ");
    scanf("%s", x.name);

    while (searched != NULL) {
        if (x.name==searched->data.name) {
            return searched->data.mean;
        }
        else {
            return NULL;
        }
    }
    return head;
}

ListNode* insert_new(ListNode* head) {
    element value;
    element data;
    ListNode* p = (ListNode*)malloc(sizeof(ListNode));

    data = p->data;
    ListNode* pre;
    printf("단어 : ");
    scanf("%s", value.name);
    printf("뜻 : ");
    scanf("%s", value.mean);

    if (head == NULL || strcmp(p->data.name, value.name) > 0) {
        p->link = head;
        head = p;
    }
    else {
        pre = search_mean(head, value);
        p->link = pre->link;
        pre->link = p;
    }

    return head;
}

ListNode* delete_new(ListNode* head) {
    element value;
    ListNode* p = head;
    ListNode* removed;

    printf("삭제할 단어 : ");
    scanf("%s", value.name);

    if (p->link == NULL) {
        return NULL;
    }
    else {
        while (p->link != NULL) {
            if (p->link->data.name == value.name) {
                removed = p->link;
                p->link = p->link->link;
                free(removed);
                return;
            }
            p = p->link;
        }
        if (p->link == NULL) {
            printf("없는 단어");
        }
    }
}

void print_list(ListNode* head) {
    for (ListNode* p = head; p != NULL; p = p->link) {
        printf("단어 : %s, 뜻 : %s\n", p->data.name, p->data.mean);
    }
    printf("\nNULL");
}

int main(void) {
    ListNode* head = NULL;

    int menu;

    while (1) {
        displaymenu();
        scanf("%d", &menu);
        switch (menu) {
            case 1:   //추가
                head = insert_new(head);
                break;
            case 2:   //삭제
                head = delete_new(head);
                break;
            case 3:   //출력
                print_list(head);
                break;
            case 4:  //종료
                printf("프로그램 종료\n");
                break;
        }
        if (menu == 4) {
            break;
        }
    }
    return 0;
}

문자 추가 후 문자열 출력 과정에서 계속해서 쓰레기 값이 발생하는데 어떤 부분이 문제인지 잘 모르겠습니다. 혹시 입력이나 출력 함수만의 문제가 아닐수도 있어 전체 코드 첨부합니다.

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.
입력 함수와 출력 함수의 문제는 아닙니다.
문제는 문자열 비교 함수인 strcmp()를 사용하는 방법입니다.
strcmp() 함수는 문자열이 같으면 0을 반환하고 같지 않으면 양수 또는 음수를 반환합니다.
따라서 x.name과 searched->data.name을 비교할 때는 strcmp() 함수를 사용해야 합니다.
if (strcmp(x.name, searched->data.name) == 0) {
return &(searched->data.mean);
}
위와 같이 수정하면 됩니다.

volatile에 대해 질문 있습니다.

2

37

2

환경설정 문

2

29

2

맥유저 입장의 고려해주세요

2

91

1

실행과정 질문입니다.

2

37

1