입력스트림과 숫자간 어떤 관계가 있는지 스트림의 개념을 통해 살펴본다.
예제코드를 보자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char str[255];
int i, i2;
double d;
scanf("%s %d %lf", str, &i, %d);
printf("%s %d %f\\n", str, i, d);
scanf("%s %d %d", str, &i, &i2);
printf("%s %d %d\\n", str, i, i2);
char c;
while ((c = getchar()) != 'n')
putchar(c);
printf("\\n");
}
첫번째 scanf에서는 d와 lf로 받고 두번째는 d와 d자료형으로 받는다. 실행시켜보자.
두번째 printf()가 1이후에 줄바꿈을 한 후 .223232323값을 출력하고 있다.
이건 내가 그냥 해본건데, 두번째 printf()안의 escape sequnce를 없애면 이런일이 안일어난다. 근데 왜? 이런일이 생기는걸까?
에 대한 설명을 하기 전에 여담을 하나 알려줌. 터미널창에서는 왜 입력할때 엔터키를 누를까. 이건 c언어가 발달한 역사까지 이야기해야하기때문에 길게 이야기하긴 어렵다. 일단 우리가 엔터키를 누르면 그때 버퍼에 담겨있던 입력들이 프로그램으로 넘어간다. 프로그램으로 값들이 입력되지 않았기 때문에 그전엔 버퍼에 있던 값들을 수정할 수 있다.(오우 이건 몰랐는데 내가 입출력 스트림에 대해 오해하고 있었다.)
아무튼 다시 코드로 돌아가서, 기본적으로 우리가 작성한 프로그램은 우리가 콘솔에 입력한값들을 문자 한글자 한글자로 받아들인다. 빈칸 하나하나까지도 문자로 받아들인다. scanf()로 받아들일때는 공백들은 모두 문자를 구별하는 기능으로 받아들인다. 이후 scanf()내부에서 받아들인 문자를 숫자는 숫자로, 공백은 공백으로 변환해서 입력받는다.
그래서 두번째 scanf에서 정수를 받아들일때 1.23~으로 입력하면, 이때 ‘.’을 인간의 의도와는 다르게(인간의 의도는 이게 소숫점임)그냥 문자가 끝난 구둣점으로 이해해버린다. 그래서 우리가 보기에 소수점 이후의 숫자들은 받아들이지 않고, 그냥 버퍼에 놔둔다. 이후
char c; while ((c = getchar()) != 'n') putchar(c); printf("\\n");
구문에서 버퍼에 남은 문자들을 하나씩 출력하면서 그때 남은 .23456..등등이 출력되는 것.
그래서 위에서 내가 가진 의문도 풀린다. 소숫점처럼 보였지만 그냥 버퍼에 남은 것들을 출력하는 것 뿐이었고, ‘\n’이 없을때는 그냥 줄바꿈 없이 버퍼에 있던 남은 내용들이 출력되어서 인간이 보기에 마치 소수점처럼 보였던 것 뿐임.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ