c언어 gets 함수 오류 질문

조회수 2007회
void main()
{

        int m=1000 ,MAX = 0;;//최솟값 최댓값

    int i, j; //for문

    int a = 0, l = 80, try = 0, r = 0; //사람수 글자수

    scanf("%d%*c", &a);
    char** name = 0;
    int** rank = 0;
    int** votes = 0;
    char NAMESIZE[NAME_SIZE];
    fgetc(stdin);

    if (a <= 20)
    {
        name = malloc(sizeof(char*) * a);
        for (i = 0; i < a; i++)
        {
            name[i] = malloc(sizeof(char) * 80);
        }

        for (i = 0; i <a; i++)
        {
            fgets(name[i],NAME_SIZE,stdin); @@@@@@@@@@@@@@@@@@
        }

        rank = malloc(sizeof(int*) * 1000);
        for (i = 0; i <10; i++)
        {
            rank[i] = malloc(sizeof(int) * a);
        }

        votes = malloc(sizeof(int*) * 1000);
        for (i = 0; i <= 1000; i++) //1000바꾸기
        {
            votes[i] = malloc(sizeof(int) * a);
        }

        for (j = 0; j <= a; j++) //여기도
        {
            votes[0][j] = 0;
        }
    }
    else printf("20명 이하로 등록해주세요.");

    vote(name, rank,votes, a, try,m,MAX);

    for(i=0;i<=a;i++)
    {
        free(name[i]);
        free(rank[i]);
    }
    free(name);
    free(votes);
        for(i=0;i<=1000;i++)
    {
        free(votes[i]);
    }
    free(rank);
}

@@@부분 봐주세요 비쥬얼 스튜디어에서는 잘 작동했는데 dev-c++프로그램은 이름을 입력하면 바로 종료가 되네요.어떻게 해결해야할까요? c언어 입니다. gets함수에서 오류가 있는 것 같아요

2 답변

  • 에러메시지를 잘 해석하면 보통 해결이 가능합니다. 아니면, 에러메시지를 구글에만 넣어서 검색해도 해결방법을 찾을 수 있어요. 질문을 올릴 때에도 에러메시지를 같이 올려주세요.

  • gets대신에 fgets를 사용할 때에는 주의가 필요합니다.

    gets 함수는 입력에서 '\n'을 읽어 들이지 않지만, fgets 함수는 '\n'까지 읽어 들입니다. 이 차이때문에 gets함수와 fgets(...,stdin)은 동일한 동작을 수행하지 않습니다.

    참고로 gets 함수는 deprecated되어서 사용할 수 없는 함수입니다.

    아래 코드 참고하세요.

    • 코드
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_NAME_SIZE 80
    
    int main()
    {
        int people_number = 0;      // 사람 수
        const int max_number = 20;
    
        printf("사람 수: ");
        scanf("%d", &people_number);
    
        char** name = NULL;
    
        if (people_number > max_number)
        {
            puts("20명 이하로 등록해주세요.");
        }
        else
        {
            name = (char**)malloc(sizeof(char**) * people_number);
            if (name)
            {
                for (int i = 0; i < people_number; i++)
                    name[i] = (char*)malloc(sizeof(char) * (MAX_NAME_SIZE + 1));
    
                for (int i = 0; i < people_number; i++)
                    if (name[i])
                    {
                        printf("%d번째 사람 이름 입력: ", i + 1);
                        scanf("%s", name[i]);
                    }
    
                for (int i = 0; i < people_number; i++)
                    if (name[i])
                    {
                        puts(name[i]);
                    }
            }
        }
    
        if (name)
        {
            for (int i = 0; i < people_number; i++)
            {
                if (name[i])
                    free(name[i]);
            }
            free(name);
        }
    
        return 0;
    }
    
    • 결과

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)