따라 배우는 C언어 : 5
🙇♀️5
🪐문자열 입출력하기
char fruit_name[40];
printf("What is your farovate fruit?\n");
scanf("%s", fruit_name);
printf("You like %s! \n", fruit_name);
char fruit_name;
printf("What is your farovate fruit?\n");
scanf("%c", &fruit_name);
printf("You like %x! \n", fruit_name);
배열이 아니라면 &를 붙여서 scanf를 사용한다.
🪐sizeof 연산자
struct MyStruct
{
int i;
float f;
};
int main()
{
// 1. sizeof basic types
int a = 0;
unsigned int int_size1 = sizeof a;
unsigned int int_size2 = sizeof (int);
unsigned int int_size3 = sizeof (a);
size_t int_size4 = sizeof(a);
size_t float_size = sizeof(float);
printf("Size of int type is %u bytes.\n", int_size1);
printf("Size of int type is %zu bytes.\n", int_size4);
printf("Size of float type is %zu bytes.\n", float_size);
// 2. sizeof arrays
int int_arr[30]; // int_arr[0] = 1024; ...
int* int_ptr = NULL;
int_ptr = (int*)malloc(sizeof(int) * 30); // int_ptr[0] = 1024; ...
printf("Size fo array = %zu bytes\n", sizeof(int_arr));
printf("Size fo pointer = %zu bytes\n", sizeof(int_ptr));
// 3. sizeof character array
char c = 'a';
char string[10]; // maximally 9 character + '\0' (null character
size_t char_size = sizeof(char);
size_t str_size = sizeof(string);
printf("Size of char type is %zu bytes.\n", char_size);
printf("Size of string type is %zu bytes.\n", str_size);
// 4. size of structure
printf("%zu\n", sizeof(struct MyStruct));
return 0;
}
🪐문자열이 메모리에 저장되는 구조
char str1[100] = "Hello";
char str2[] = "Hello";
char str3[100] = "\0";
char str4[100] = "\n";
printf("%zu %zu\n", sizeof(str1), strlen(str1)); // 100 5
printf("%zu %zu\n", sizeof(str2), strlen(str2)); // 6 5
printf("%zu %zu\n", sizeof(str3), strlen(str3)); // 100 0
printf("%zu %zu\n", sizeof(str4), strlen(str4)); // 100 1
// Extra
char* str5 = (char*)malloc(sizeof(char) * 100);
str5[0] = 'H'; str5[1] = 'e'; str5[2] = 'l'; str5[3] = 'l'; str5[4] = 'o';
str5[5] = '\0';
printf("%zu %zu\n", sizeof(str5), strlen(str5));
문자열을 사용하려면 #include <string.h>
를 사용해야되고 malloc은 #include <stdlib.h>
가 필요함
🪐printf() 함수의 변환 지정자들
- 함수의 변환 지정자들
- %a : 부동 소수점 수, 16진수, p-표기법
- %A : 부동 소수점 수, 16진수, p-표기법
- %c : 한 글자
- %d (또는 %i) : 부호가 있는 10진(decimal)정수(integer)
- %e : 부동 소수점 수, e-표기법
- %E : 부동 소수점 수, E-표기법
- %f : 부동 소수점 수, 10진수 표기
- %g : 값에 따라서 %e나 %f 사용. 지수가 -4보다 작거나 정밀도보다 크거나 같을 경우에는 %e 사용
- %G : 값에 따라서 %E나 %f 사용. 지수가 -4보다 작거나 정밀도보다 크거나 같을 경우에는 %E 사용
- %o : 부호가 없는 8진(octal)정수
- %p : 포인터
- %s : 문자열
- %u : 부호가 없는 10진 정수
- %x : 부호가 없는 16진 정수, 소문자 알파벳 사용
- %X : 부호가 없는 16진 정수, 대문자 알파벳 사용
- %% : 퍼센트 기호 출력
double d = 3.141582123456789123456789123456789123456789;
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); // Note overflow
printf("%u %u %u \n", 1024, -1, UINT_MAX); // Note overflow
printf("\n");
printf("%f %f %lf\n", 3.141592f, d, d); // l in %lf is ignored
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); // pointer-of operator
printf("\n");
printf("%x %X\n", 11, 11);
printf("%%\n", d);// Note the warning. d is ignored.
printf("\n");
printf("%9d\n", 12345);
printf("%09d\n", 12345);
printf("%.2f\n", 3.141592);
printf("%.20f %.20lf\n", d, d);
printf("\n");
int n_printed = printf("Counting!");
printf("%u\n", n_printed);
🪐변환 지정자의 수식어들
- 형식지정자
%[flags][width][.precision][length]specifier
ex) printf("%+10.5hi", 256);
#include <stdio.h>
#include <limits.h>
int main()
{
printf("%10i\n", 1234567890);
printf("%10i\n", 1234567);
printf("%-10i\n", 1234567);
printf("%+i %+i\n", 123, -123);
printf("% i \n% i\n", 123, -123);
printf("%X\n", 17);
printf("%#X\n", 17);
printf("%05i\n", 123);
printf("%*i\n", 7, 456);
printf("\nPrecision\n");
printf("%.3d\n", 1024);
printf("%.5d\n", 1024);
printf("%.3f\n", 123456.1234567);
printf("%.3f\n", 123456.12345);
printf("%10.3f\n", 123.45678);
printf("%010.3f\n", 123.45678);
printf("%.5s\n", "ABCDEFGHIJKLMN");
printf("%.s\n", "ABCDEFGHIJKLMN"); // assumes .0
printf("\nLength\n");
printf("%hhd %hd %d\n", 257, 257, 257);
printf("%d %lld %lld\n", INT_MAX + 1, INT_MAX + 1, 2147483648LL);
}
🪐printf() 함수가 인자들을 해석하는 과정
float n1 = 3.14; // 4 bytes
double n2 = 1.234; // 8 bytes
int n3 = 1024; // 4 bytes
printf("%f %f %d\n\n", n1, n2, n3);
// Note the warnings in output window
printf("%d %d %d\n\n", n1, n2, n3); // 4, 4, 4 (N, N, N)
// 답안지를 밀려쓴 것 처럼 8바이트를 4바이트만큼만 읽었기에 이상한 값이 나옴
printf("%lld %lld %d\n\n", n1, n2, n3); // 8, 8, 4 (N, N, Y)
// 실수를 정수로 표현하려니까 이상한 값이 나옴 크기는 맞음
printf("%f %d %d\n\n", n1, n2, n3); // 8, 4, 4 (Y, N, N)
// 두 번째가 타입이 안맞고 크기가 다르므로 세 번째도 이상한 값이 나옴
printf("%f %lld %d\n\n", n1, n2, n3); // 8, 8, 4 (Y, N, Y)
// 두 번째가 타입이 안맞지만 크기는 같으므로 세 번째 값은 정상임
🪐scanf() 함수의 사용법
// 수식어
// * : 무시
// 숫자 : 입력받을 최대 넓이
// hh : 정수를 signed char 또는 unsigned char로 읽어들임
// ll : 정수를 lon long 또는 unsigned long long으로 읽어들임
// h,l,l : %hd(%hi) -> short int
// %ho,%hx,%hu -> unsigned short int (%d,%i,%o,%x -> int)
// %ld,%li -> long
// %li,%lx,%lu -> unsigned long
// %le,%lf,%lg -> double (%e,f,%g -> float)
// %Le, %Lf, %Lg -> long double
// j : intmax_t 또는 uintmax_t 자료형 (C99)
// z : sizeof 연산자의 반환값의 자료형
// t : 두 포인터의 차이 (C99)
// 배열을 입력 받을 때는 &를 안붙인다!
// double을 scanf로 받을 때는 %lf를 꼭 써야한다
// float는 %f로 해도 된다