강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

노진수님의 프로필 이미지
노진수

작성한 질문수

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

작성

·

476

·

수정됨

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

노진수님의 프로필 이미지
노진수

작성한 질문수

질문하기