🙇‍♀️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;
}

sizeof ex


🪐문자열이 메모리에 저장되는 구조

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>가 필요함

strlen ex


🪐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);

형식 지정자 ex


🪐변환 지정자의 수식어들

  • 형식지정자

%[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)
// 두 번째가 타입이 안맞지만 크기는 같으므로 세 번째 값은 정상임

printf ex


🪐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로 해도 된다

태그:

카테고리:

업데이트: