혹시 gets_s함수는 2번 이상 입력받지 못하나요?

조회수 491회
#include <stdio.h>
#include <string.h>

int main()
{
    char str[128];
    int key;

    while (1)
    {
        printf("문자열?");
        gets_s(str, sizeof(str));

        printf("암호 키(정수)?");
        scanf("%d", &key);

        printf("입력된 문자열 : %s\n", str);
    }
}

현재 실행결과

문자열?abc

암호 키(정수)?3

입력된 문자열 : abc

문자열?암호 키(정수)?qwe

입력된 문자열 :

문자열?암호 키(정수)?4

입력된 문자열 : qwe

문자열?암호 키(정수)?

제가 원하는 실행결과'

문자열?abc

암호 키(정수)?3

입력된 문자열 : abc

문자열?qwe

암호 키(정수)?4

입력된 문자열 : qwe

문자열?

질문내용

시저암호 문제를 풀던 도중 이해가 안 되는 부분만 따서 가져왔습니다. 위와 같은 현재 실행결과가 왜 나오는 건지, 원하는 실행결과가 나오게 하기 위해선 어떻게 해야 하는지 알려주시면 감사하겠습니다.

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

1 답변

  • 지금 생긴 문제는 scanf 함수 다음에 gets_s함수를 사용했기 때문입니다.

    질문에서 처럼 3을 입력하고 엔터를 치게 되면, 입력 스트림이라는 곳으로 "3\n"이라는 값이 입력됩니다. 3은 숫자 3이고 \n은 엔터를 쳤기 때문에 입력된 값입니다.

    이 상태에서 scanf("%d", &key);를 실행하면, 입력 스트림에서 %d에 해당하는 정수 형태의 값인 3을 가져다가 정수로 변환하여 key에 넣어줍니다. 이제 입력 스트림에는 "\n"만 남아 있는 상태가 됩니다.

    그런데 get_s 함수는 입력 스트림으로부터 \n까지의 모든 문자들을 읽어 들이고 \n전까지의 내용을 배열에 저장하는 함수입니다.

    현재 입력 스트림에 "\n"만 남아 있는 상태에서 gets_s(str, sizeof(str));이 실행되었기 때문에, 함수가 실행은 되지만 배열 str에 저장할 값은 없고 str의 첫칸에 '\0'(널문자)만 저장됩니다.

    이러한 이유로 gets_s 함수가 스킵된 것처럼 느껴진 겁니다. 사실은 실행이 된 것이지요.

    다시 정리하자면 이러한 일이 발생된 이유는 scanf 함수 직후에 gets 함수를 사용했기 때문입니다.

    아래와 같이 해결하시면 됩니다.

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char str[128], temp[128];
        int key;
    
        while (1)
        {
            printf("문자열?");
            gets_s(str, sizeof(str));
    
            printf("암호 키(정수)?");
            scanf("%d", &key);
            gets_s(temp, sizeof(temp));
    
            printf("입력된 문자열 : %s\n", str);
        }
    }
    
    • 결과

    이미지

    반드시 gets_s 함수를 써야하는 것이 아니라면 아래와 같이 scanf(" %s", str); 함수를 사용해도 됩니다. 이때 " %s"에서 %s 앞의 스페이스 한칸은 오타가 아니며 일부러 넣은 것입니다. scanf(" %s", str);는 공백 문자 다음의 문자열을 str에 저장해 달라는 뜻입니다. 공백 문자는 스페이스나 \t, \n 등을 말합니다.

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char str[128];
        int key;
    
        while (1)
        {
            printf("문자열?");
            scanf(" %s", str);
    
            printf("암호 키(정수)?");
            scanf("%d", &key);
    
            printf("입력된 문자열 : %s\n", str);
        }
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 철수님 답변에 추가드리면 꼭 gets 함수를 써야한다면 scanf 이후에 fflush 로 stdin(입력버퍼)를 초기화 시켜야합니다. 김호원 2021.8.23 11:07
    • 며칠 동안 계속 고민해도 모르겠어서 처음 질문해본 건데, 이렇게 친절하게 답변해주셔서 정말 감사드립니다. 알 수 없는 사용자 2021.8.23 17:38

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

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

(ಠ_ಠ)
(ಠ‿ಠ)