※제 메모는 강의에 대한 이야기도 있지만, 단순히 제가 이해가 안 되어서 따로 조사한 것들도 있습니다.
scnaf에서 double을 입력 받을 때 주의점
printf 함수는 가변 인자로 인해 float를 double로 자동변환해준다.
따라서 출력을 할때도 %f로 float형태로 그냥 썼었다.
하지만 scanf에서 입력을 받을 때는 %f가 아닌 %lf로 해야한다.
c plusplus 레퍼런스에 따르면, l + f 는 double을 받는다.
따라서 printf는 %f로 써도 되지만, scanf는 double로 입력 받을 때는 lf로 써야한다.
만약에 그냥 f로 입력 받게 되면 어떻게 될까?
이런 식으로 0.0000 으로 뜬다.
이것은 메모리의 사이즈가 double이 float보다 커서 발생하는 문제이다. (다만, 반대의 경우는 성립 가능한다.)
scanf와 printf가 항상 1대1 대응으로 입력 받는 것이 아니다. 항상 주의하자.
예제 1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <inttypes.h> // intmax_t
int main()
{
int i;
float f;
char str[30];
scanf("%d %f %s", &i, &f, str);
printf("%d, %f %s\\n", i, f, str);
return 0;
}
● 여러번 입력을 받을 때는 123 (enter) 3.14 (enter) hello 말고도, 123 3.14 hello 중간 중간 spacebar로도 입력할 수 있다.
여기에 대한 설명으로 c plusplus에서 설명하는 구문이 있다.
It can optionally contain embedded format specifiers that are replaced by the values specified in subsequent additional arguments and formatted as requested.
해석하면, 선택적으로 내장된 서식지정자를 포함 할 수 있으며, 서식지정자는 후속 추가적인 인수 안의 지정된 값으로 대체될 수 있고, 요청에 따라 형식화된다.
즉, printf에서 형식 지정자를 추가적으로 받을 수 있고, 그것이 지정된 값으로 바꿀 수 있다는 것이다.
예제 2)
#include <stdio.h>
int main()
{
int i = 20;
char c = 65;
printf("나이는 %d, 등급은 %c 입니다. \n", i, c);
return 0;
}
저 말을 예제로 만들어보았다.
%d는 i와 바꾸고, 추가적인 지정자 %c는 c와 바꾼다.
그리고 출력 결과
나이는 20 등급은 A 입니다. 가 출력된다.
이러한 원리에 따라 작동하는구나 라고 머리에 상기만 시켜두자.
아무튼 다시 돌아와서 예제 1)을 다시 살펴보면,
이 코드에서 123 345 hello hi 을 입력하면
출력은 123 345 hello가 출력된다.
그렇다면 hi는 어디로 갔을까?
hi는 버퍼라는 임시 저장소에 저장된다고 한다.
버퍼(buffer)란?
데이터를 임시로 저장하는 메모리 영역을 말한다.
주로, 입출력 작업에서 사용되는데, 데이터가 한 곳에서 다른 곳으로 전송될 때 중간에 임시로 저장하는 역할을 한다.
버퍼는 나중에 가서 중요한 개념이 되므로, 일단은 개념만 알아두면 될 것 같다.
※ &s, &f는 &가 있지만 배열을 입력 받을 때에는 &를 안 붙인다.
출처: 홍정모의 따라배우는 C언어
강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음
'배운 것들 메모 > 따라 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 5.1 반복 루프(loop)와의 첫 만남 (0) | 2024.08.26 |
---|---|
4.10 강 들으면서 추가적으로 조사한 것 -2 (0) | 2024.08.25 |
[홍정모의 따라하며 배우는 C언어] 4.7 printf() 함수의 변환 지정자들 메모 (0) | 2024.08.19 |
[홍정모의 따라하며 배우는 C언어] 4.5 ~ 4.6 기호적 항수와 전처리기 메모 (0) | 2024.08.12 |
[홍정모의 따라하며 배우는 C언어] 4.4 strlen() 함수 메모 (0) | 2024.08.10 |