• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

마지막 custom input function 예제에서 버퍼비우기 코드의 역할이 궁금합니다

23.04.16 22:14 작성 23.04.16 22:23 수정 조회수 390

1

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define STRLEN 81

char* custom_string_input(char* st, int n);

int main()
{
	char word[11];
	puts(custom_string_input(word, 11));

	return 0;
}

char* custom_string_input(char* st, int n)
{
	char* ret_ptr;
	int i = 0;
	char ch;
	ret_ptr = fgets(st, n, stdin);
	if (ret_ptr)
	{
		while (st[i] != '\n' && st[i] != '\0')
			i++;
		if (st[i] == '\n')
			st[i] = '\0';
		//else
		//	while ((ch = getchar()) != '\n')	// clear buffer
		//		continue;
	}
	return ret_ptr;
}

1.위의 코드에서 버퍼 비우기 코드 else 부분을 주석 처리하고 실행해도, 버퍼에 남아있는 문자들이 결과에 영향을 주지 않는 것 같은데요

(재실행해도 이전 버퍼에 영향을 받지 않는 것 같고요)

버퍼 지우기 코드가 있어야 할 이유가 있나요? 안정성을 위한 부분일까요?

2.버퍼를 디버거의 memory로 확인하는 방법이 있을까요? 버퍼에 대해 헷갈릴 때 직접 디버거로 찍어보고 싶은데, 방법을 모르겠어요

 

3.gets()함수에 대해 설명하실때,

gets() reads one line and removes \n and add \0

라고 하셨는데, 여기서 \n을 지운다는게 버퍼에서 지운다는 얘기일까요?

 

답변 1

답변을 작성해보세요.

1

Soobak님의 프로필

Soobak

2023.04.17

안녕하세요, 답변 도우미 Soobak 입니다.

1. 위의 코드에서 버퍼 비우기 코드 else 부분을 주석 처리하고 실행해도, 버퍼에 남아있는 문자들이 결과에 영향을 주지 않는 것 같은데요 버퍼 지우기 코드가 있어야 할 이유가 있나요? 안정성을 위한 부분일까요?
: 네, 표준 입력 버퍼는 운영체제와 환경에 따라서 크기나 구현 방식이 다르기 때문에 해당 코드를 통해 버퍼를 깨끗하게 유지하는 것이 더 안정적인 방법입니다.

2.버퍼를 디버거의 memory로 확인하는 방법이 있을까요? 버퍼에 대해 헷갈릴 때 직접 디버거로 찍어보고 싶은데, 방법을 모르겠어요
: 일반적으로 디버거를 통해 표준 입력의 버퍼를 직접 살펴보는 방법은 지원되지 않습니다. 질문 1의 답변에서처럼, 버퍼의 관리 방식은 운영체제와 환경에 따라서 다르기 때문입니다.

하지만 표준 입/출력 관련 함수들을 통해 직접 출력해볼 수는 있습니다. 간단한 예시 코드를 첨부드립니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char buffer[1024];
    char input[11];
    int i = 0;

    printf("입력 : ");
    fgets(input, sizeof(input), stdin);

    printf("입력한 값 : %s\n", input);

    printf("버퍼에 남아있는 값 : ");
    while (buffer[i] != '\n' && buffer[i] != '\0')
    {
      buffer[++i] = getchar();
      putchar(buffer[i]);
    }

    return 0;
}


3. gets()함수에 대해 설명하실때, gets() reads one line and removes \n and add \0 라고 하셨는데, 여기서 \n을 지운다는게 버퍼에서 지운다는 얘기일까요?
: "버퍼에서 지운다" 라는 표현보다는, "read 하는 과정에서 지운다" 라는 표현이 더 알맞을 것 같습니다.
예를 들어서, gets() 함수를 호출하면 다음과 같은 과정을 거칩니다.
(1). 문자를 표준 입력 스트림(stdin)에서 읽음 (일반적으로 표준 입력 스트림에는 버퍼가 연결되어 있습니다.)
(2). 만약 읽은 문자가 '\n' 이라면, 문자열에 '\0' 을 대신 저장하고 문자열 입력을 종료