[8일차](홍정모의따배c)문자열과 형식 맞춘 입출력
*본 강의수기는 교수님의 모든 ppt나 코드 화면을 붙인게 아닙니다. 따로 출처 표시나 과제표시
안한 모든 코드와 사진자료의 출처는 본 강의의 교수님 입니다.
정리는 다시한번 제가 보기위함과 어떤강의인지 알려드리는 것이고
제가 적은건 이해를 돕기 위한 부연설명과 제가 이해한 몇개의 중심적인 내용이 다소
생략이 되었습니다. 이 수기를 통해 공부하려 하지말고 흥미로운 내용이라면
'인프런- 홍정모의 따라하며 배우는c' 과정을 수강하시길 바랍니다.
printf()함수의 변환지정자들
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main()
{
double d = 3.141592653589793238462643383279;
printf("%c\n", 'A');
printf("%s", "I love you\n");
printf("Even if there's a small chance, \
we owe this to everyone who's not in this room to try.\n");
// '\' 입력하면 한라인 띄울 수 있다
printf("\n");
printf("%d %i %i %i\n", 1004, 1234, INT_MAX, UINT_MAX);
//i자리에 언사인드 인트를끼워넣으니 스택오버플로우가 발생해 -1이 나왔다.
printf("%u %u %u\n", 1024, -1, UINT_MAX);
//언사인드인트 자리에 음의정수를 넣으니 스택오버플로우가
// 발생해 4294967295가 나왔다.
printf("\n");
printf("%f %f %lf\n", 3.141592f, d, d); //lf는 무시되었다.
printf("%a %A\n", d, d);
printf("%e %E\n", d, d);
printf("\n");
printf("%g %g\n", 123456.789, 1234567.89);
printf("%G %G\n", 123456.789, 1234567.89);
printf("%g %g\n", 0.00012345, 0.000012345);
printf("%G %G\n", 0.00012345, 0.000012345);
printf("\n");
printf("%o\n", 9);
printf("%p\n", &d);
printf("\n");
printf("%9d\n", 12345); //출력할 때 최소 9글자 써라
printf("%09d\n", 12345);// 출력할때 9칸을쓰고 빈칸을 0으로 써라
printf("%.2f\n", 3.141592);//소수점이하자리를 2자리 출력
printf("%.20f %.201f\n", d, d);//담지못하는건 뒤에 잘려나가지만
// gcc는 가능
printf("\n");
int n_printed = printf("Counting!");
printf("%u\n", n_printed);
return 0;
}
변환지정자의 수식어들
#include <stdio.h>
#include <limits.h>
int main()
{
printf("%10i\n", 1234567); //10자리 출력하고 남는 앞칸 공백
printf("%-10i\n", 1234567); //10자리 출력하고 남는 뒷칸 공백
printf("%+i %+i\n", 123, -123); //양의정수라도 앞에 +붙이기
//음의정수는 -그대로 붙이기
printf("% i \n&% i\n", 123, -123);
//한칸띄우고 출력하기 음의정수면 공백자리에 - 부호붙이기
printf("%X\n", 17); //16진수로 표현
printf("%#X\n", 17); //앞에부호붙은 16진수로 표현
printf("%05i\n", 123); //5자까지표현하고 앞쪽남는 수에 0붙이기
printf("%*i\n", 7, 456);//*에 첫번째 수대입한만큼 자릿수 출력하기
printf("\nPrecision\n");
printf("%.3d\n", 1024); //세자리수 출력하고 자릿수 넘어가도 그대로 출력
printf("%.5d\n", 1024);// 다섯자리 출력하고 앞에 수 남으면 0으로 채우기
printf("%.3f\n", 123456.1234567);//소수점 세자리수 까지 표시하고
//끝에 반올림
printf("%.3f\n", 123456.1235); //소수점 세자리 출력하고 끝에
// 반올림
printf("%10.3f\n", 123.45678);//총 10자리 출력하고 소수점은
// 세자리수 출력
printf("%010.3f\n", 123.45678);//총열자리 출력 소수점 세자리 출력 앞에 남는칸 0으로 출력
printf("%.5s\n", "ABCDEFGHIJKLMN");//5자배열까지 출력
printf("%.s\n", "ABCDEFGHIJKLMN");//.에 숫자안붙으면
// 0자리로 취급함
printf("\nlength\n");
printf("%hhd %hd %d\n", 257, 257, 257); //hhd에서 오버플로우
printf("%d %lld %lld\n", INT_MAX + 1,\
INT_MAX + 1, INT_MAX + 1);
return 0;
}
printf()함수가 인자들을 해석하는 과정
타입이 맞는인수가 올바른 메모리 스택에 들어가 출력된다.
#include <stdio.h>
int main()
{
float n1 = 3.14; //4bytes
double n2 = 1.234;//8bytes
int n3 = 1024; //4bytes
printf("%f %f %d\n\n", n1, n2, n3);
//정상출력
printf("%d %d %d\n\n", n1, n2, n3);//4, 4, 4 메모리가 안맞다
printf("%lld %lld %d\n\n", n1, n2, n3);//8, 8, 4메모리안맞고
//타입도 세번째만 타입이 맞다
printf("%f %d %d\n\n", n1, n2, n3);//8, 4, 4 n1제대로 출력
// n3출력
printf("%f %lld %d\n\n", n1, n2, n3);//8, 8, 4 n1,n3출력
return 0;
}
scanf()함수의 사용법
#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);
//공백을 끝난입력이라 인식하여 im sleepybird
//라 했을때 im까지만 나온다.
return 0;
}
#include <stdio.h>
int main()
{
char c;
scanf("%c", &c);
printf("%i\n", c); //아스키코드를 뱉는다 공백을 넣어도
// 공백에 해당하는 코드를 내뱉는다.
return 0;
}
#include <stdio.h>
int main()
{
unsigned i; //분명 unsigned인데
scanf("%i", &i); //받은걸 언사인드 메모리로
//담아놨다가 다시 사인드로 꺼내기 때문에
printf("%i\n", i);// 네거티브숫자를 넣어도
//잘나온다
return 0;
}
#include <stdio.h>
int main()
{
unsigned i2; //원래 언사인드라 음수를 못받는다
scanf("%u", &i2); //그래서 음수를 넣었을때
printf("%u\n", i2);//오버플로우가 발생함
return 0;
}
#include <stdio.h>
int main()
{
double d = 0.0;
scanf("%lf", &d); //l을 제거하면
//메모리가 안맞아 오버플로우 발생
printf("%f\n", d);
return 0;
}
#include <stdio.h>
int main()
{
char i;
scanf("%hhd", &i);//큰숫자를 입력하면
printf("%i\n", i);//오버플로우 발생
return 0;
}
#include <stdio.h>
int main()
{
int i; //정수로 담고있고
scanf("%i", &i);//정수로 입력하기에
printf("%i\n", i);//123a같은 문자가나오면
//123까지 출력하고 멈춘다.
return 0;
}
#include <stdio.h>
#include <inttypes.h> //intmax_가 있는곳
int main()
{
intmax_t i; //intmax_t타입형에는
scanf("%ji", &i);//j라는 수식어가 입력과
printf("%ji", i);//출력에 둘다 붙는다.
return 0;
}
#include <stdio.h>
int main()
{
int a, b;
scanf("%d,%d", &a, &b);//두 숫자 가운데
//쉼표를 넣어야 한다
//쉼표대신 공백을 넣으면 오류남
printf("%d %d\n", a, b);
return 0;
}
#include <stdio.h>
int main()
{
int a, b;
char c;
scanf("%d%c%d", &a, &c, &b);//123
//공백 456을 넣어보자
printf("%d|%c|%d", a, c, b);
//바 가운데 공백이 들어간다
return 0;
}
#include <stdio.h>
int main()
{
int a, b, c;
int i = scanf("%d%d%d", &a, &b, &c);
//scanf한 값을 i로 반환시켜 숫자의갯수를
printf("%d", i);// i로 출력시킬 수 있다.
//나오는 값은 3
return 0;
}
#include <stdio.h>
int main()
{
int i = 123;
int width = 5;
printf("Input width : ");
scanf("%d", &width);//총 몇칸 사용할 지
//입력
printf("%*d\n", width, i);
//width값이 *로 간다.
return 0;
}
#include <stdio.h>
int main()
{
int i;
scanf("%*d%*d%d", &i);
//*는 %와 변수사이 넣어 그값을 무시하는 기능도
//있다
printf("Your third input = %d", i);
//두번 무시하고 세번째 입력한 값을 받는다.
return 0;
}