C언어 버퍼에 관해서..

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

int main()
{
    char ss[100];
    char tt[100];

    printf("ss input : ");
    scanf("%s", ss);

    printf("tt input : ");
    gets(tt);

    printf("ss output : ");
    printf("%s", ss);

    printf("tt output : ");
    puts(tt);

    return 0;
}

위의 코드에서 scanf() 함수를 통해 ss에 값을 입력하고 그다음 gets() 함수를 통해 tt에 값을 입력해주려고 하는 데 값을 입력하지 못하고 그냥 넘어가거든요. 이게 버퍼에 이미 값이 들어가 있어서 그런거 같은데 제가 이해한게 맞을까요? 근데 제가 아이러니한 것은 아래 코드를 보면 gets() 함수를 통해 배열을 입력해주는데 그다음 scanf() 함수에는 위의 코드와는 다르게 배열을 입력해줄 수 있다는 거에요. 이렇게 보면 왜 위의 코드는 저의 의도대로 실행되지 않는지 잘 이해가 되지 않네요. 컴퓨터에 버퍼라는 것이 각 입력 받을 변수마다 있는 건지 아니면 하나의 버퍼로 다같이 공유하는 건지 잘 모르겠어요.

질문을 쓰다보니까 제가 잘 질문하고 있는지 모르겠네요 도움 부탁드려요..!!

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

int main()
{
    char ss[100];
    char tt[100];

    printf("tt input : ");
    gets(tt);

    printf("ss input : ");
    scanf("%s", ss);

    printf("tt output : ");
    puts(tt);

    printf("ss output : ");
    printf("%s", ss);

    return 0;
}

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    scanf 함수로 문자열을 읽게되면 표준입력의 버퍼에서 처음 만나는 공백문자(스페이스, 탭, '\n' 등)가 아닌 문자부터 다시 공백문자을 만날때까지의 문자들을 배열에 저장합니다. 공백 문자를 만나면 그 공백문자를 버퍼에 남겨두고 저장을 종료합니다. 따라서 abc를 입력하고 엔터를 쳤다면 abc가 배열로 저장되고 엔터값에 대한 아스키 코드인 '\n'이 표준입력의 버퍼에 남아 있게 됩니다.

    반면에 gets함수는 표준입력의 버퍼의 맨처음부터 처음으로 만나는 '\n'까지의 모든 것을 배열에 저장합니다. 이때 '\n'은 버퍼에서 사라지고 배열에 저장하지는 않습니다.

    따라서 질문처럼 scanf함수를 사용한 직후에 gets 함수를 사용하게 되면, gets함수는 scanf 함수가 남겨둔 '\n'을 읽게 되고, 그 이후의 값을 읽어오지 않아서 결국 gets로 배열에 저장한 값은 없는 것입니다.

    참고로 gets 함수는 표준환경에서 deprecated되어서 더이상 사용할수 없습니다. fgets 함수를 대신 사용할수 있는데, fgets 함수는 '\n'까지도 배열에 저장한다는 점에서 주의가 필요합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 정말로 감사합니다 . 제가 궁금했던 부분을 너무 잘 해결해주셨어요!!! 열공하겠습니다! 선태욱 2022.6.7 19:19

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

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

(ಠ_ಠ)
(ಠ‿ಠ)