작성
·
485
·
수정됨
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 입니다.
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'
을 대신 저장하고 문자열 입력을 종료