#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); // Note % is absent in front of str
printf("%d %f %s\n", i, f, str);
char c;
scanf("%c", &c); // try blank
printf("%i\n", c); // blank is 32
위의 예시에서 아스키 코드 출력하라고 명령. 위의 예제에서는 빈칸을 무시했지만, 문자로 입력 받는 상황에서는 빈칸도 문자 처리 한다.
unsigned i;
scanf("%i", &i); // try negative number
printf("%i\n", i);
unsigned
이지만, 받을 때 signed
로 받고 다시 signed
로 꺼내기 때문에 상관은 없는 상황.
하지만 깔끔한 코딩이 아니고 다른 사람이 헷갈릴 수 있으니 unsigned
는 unsigned
로 대접하자.
unsigned i;
scanf("%u", &i); // try negative number
printf("%u\n", i);
대신 이렇게 하면 음수를 집어넣으면 overflow
가 발생한다.
// l for double for %f, %e, %E %g
double d = 0.0;
scanf("%lf", &d);
printf("%f\n", d);
scanf
에서는 double
을 항상 lf
로 받아주어야 한다.
char str[50];
scanf("%5s", str);
printf("%s\n", str);
너비가 5로 지정되어 있으므로 많이 입력해도 앞의 5자리만 출력된다.
char i;
scanf("%hhd", &i);
printf("%i\n", i);
이런 경우는 당연히 큰 수를 넣게 되면 다른 값이 나오게 된다.
int i;
scanf("%i", &i);
printf("%i\n", i);
123dk23
을 입력하면 123
만 출력.
즉, 문자를 만나면 멈춘다.
intmax_t i;
scanf("%ji", &i);
printf("%i\n", i);
int a, b;
scanf("%d,%d", &a, &b); // try blank separator only
printf("%d %d\n", a, b);
평소의 경우는 (number)(blank)(number)
였지만 위와 같이 ,
같은 문자가 들어간 경우는 (number),(number)
처럼 입력해야한다.
scanf("%d ,%d", &a, &b);
와 같이 입력한다면, 가운데 빈칸이 많이 와도 무시하고 출력한다.
"%dK%d"
이런 식으로 쓰면 ,
와 같은 방식으로 입력하면 된다.
int a, b;
char c;
scanf("%d%c%d", &a, &c, &b); // try 123 456 (blank)
printf("%d|%c|%d\n", a, c, b); // | is seperator
int a, b;
int i = scanf("%d%d", &a, &b);
printf("%d", i);
이 경우 a와 b에 각각 값을 입력하면 2가 return이 된다. 2가지가 입력되었으므로 2가 출력된다.
int i = 123;
int width = 5;
printf("input width : ");
scanf("%d", &width);
printf("%*d\n", width, i);
1을 입력하면 123
의 너비인 3보다 좁으므로 123이 그대로 출력된다.
그러나 5와 같은 큰 숫자를 입력하게 되면 __123
이 출력되게 된다.
int i;
scanf("%*d%*d%d", &i);
printf("Yout third input = %d", i);
return 0;
}
입력은 123 456 789
이런 식으로 받고, 출력은 뒤의 789만 출력이 된다.