[6일차](홍정모의따배c)문자열과 형식맞춘 입출력
*본 강의수기는 교수님의 모든 ppt나 코드 화면을 붙인게 아닙니다. 따로 출처 표시나 과제표시
안한 모든 코드와 사진자료의 출처는 본 강의의 교수님 입니다.
정리는 다시한번 제가 보기위함과 어떤강의인지 알려드리는 것이고
제가 적은건 이해를 돕기 위한 부연설명과 제가 이해한 몇개의 중심적인 내용이 다소
생략이 되었습니다. 이 수기를 통해 공부하려 하지말고 흥미로운 내용이라면
'인프런- 홍정모의 따라하며 배우는c' 과정을 수강하시길 바랍니다.
문자열 출력
#include <stdio.h>
int main()
{
char fruit_name; //글자자료형으로 변수선언
printf("What is your favorate fruit\n");
scanf("%c", &fruit_name); //&fruit_name 의 주소를 불러와야하기 때문에 그리고
//char에 해당하는 자료를 부르기 때문에 %c
printf("You like %c\n!", fruit_name);
return 0;
}
이러고 컴파일해서 사과라고 입력했는데
a라고 밖에 못한다
#include <stdio.h>
int main()
{
char fruit_name[40]; //아직 배우진 않았지만 배열이라고 한다
printf("What is your favorate fruit\n");
scanf("%s", fruit_name); //배열을 불러올땐 %c를 %s로 바꾸고 fruit_name에도 &를 빼도 된다
// fruit_name 그 자체가 주소가 된다고 한다
printf("You like %s\n!", fruit_name); //여기도 c를 s로 바꿔준다.
return 0;
}
굳
sizeof 연산자
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 0;
unsigned int int_size1 = sizeof a;
unsigned int int_size2 = sizeof(int);
unsigned int int_size3 = sizeof(a); //sizeof는 함수처럼 쓰이나 연산자라는 개념
//에 가깝다고 생각해야 한다.
size_t int_size4 = sizeof(a);//size_t는 좀더 이식성이 강한 자료형? 연산자라고 했다
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); //size_t 전용이다 %zu는
printf("Size of float type is %zu bytes.\n", float_size);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int int_arr[30];
int* int_ptr = NULL;//메모장 꺼냈다
int_ptr = (int*)malloc(sizeof(int) * 30); //이거써라
printf("Size of array = %zu bytes\n", sizeof(int_arr));
printf("Size of pointer = %zu bytes\n", sizeof(int_ptr)); //8이 나오는 이유는 메모장의 크기를 출력했기 때문이다 반면 배열[30]은 선언즉시 메모리를120까지 할당한다.
return 0;
}
문자열이 메모리에 저장되는 구조
#include <stdio.h>
int main()
{
char c = 'a';
char str1[10] = "Hello"; //컴퓨터에서는 첫번째로 세는 수를 1번째라고 안한다 0번째라고 한다
char str2[10] = { 'H', 'i'};//10가지 배열중 0번째부터 1번째까지 H 와 I를 넣은것
printf("%c\n", c);
printf("%s\n", str1);
printf("%s\n", str2);
return 0;
}
#include <stdio.h>
int main()
{
char c = 'a';
char str1[10] = "Hello";
char str2[10] = { 'H', 'i'};
printf("%c\n", c);
printf("%s\n", str1);
printf("%s\n", str2);
printf("%hhi %hhi %hhi %hhi %hhi\n", str2[0], str2[1], str2[2], str2[3], str2[4]); //해당하는 아스키코드(%hhi)로 출력 배열2의 i다음에는
//공백이므로 없다
return 0;
}
#include <stdio.h>
int main()
{
char str3[20] = "Hello, \0world";
printf("%s\n", str3); //출력에서 공백을 만나는 순간(\0) 출력을 즉시멈춘다.
return 0;
}
#include <stdio.h>
int main()
{
char str3[20] = "Hello, \0world";
printf("%s\n", str3); //출력에서 공백을 만나는 순간(\0) 출력을 즉시멈춘다.
printf("%s\n", str3);
printf("%c\n", str3[10]);
return 0;
}
하지만 열번째에 해당하는 r이란 값은 살아있다
!주의
빈칸과 널캐릭터(\0)는 다르다
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100] = "Hello";
char str2[] = "Hello"; //[]공백은 백지수표라 생각하자 뒤에 적은 글자 수 만큼 컴퓨터가
//알아서 자리를 내준다.
char str3[100] = "\0";//\0은 숫자로 안센다
char str4[100] = "\n";//하지만 공백은 센다. \0와 절대 착각하지 말자.
printf("%zu %zu\n", sizeof(str1), strlen(str1)); //strlen은 배열마지막
// \0까지 세는게아니라 사람관점에서의 숫자를 세어 준다 그래서 5가 나온다.
printf("%zu %zu\n", sizeof(str2), strlen(str2));
printf("%zu %zu\n", sizeof(str3), strlen(str3));
printf("%zu %zu\n", sizeof(str4), strlen(str4));
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
char* str5 = (char*)malloc(sizeof(char) * 100); //char의 메모리사이즈의 100배에 해당하는 자리를 str5에 할당한다?..라고 이해했다.
str5[0] = 's';
str5[1] = 'l';
str5[2] = 'e';
str5[3] = 'e';
str5[4] = 'p';
str5[5] = 'y';
str5[6] = 'b';
str5[7] = 'i';
str5[8] = 'r';
str5[9] = 'd';
printf("%zu %zu\n %s\n", sizeof(str5), strlen(str5), str5);
return 0;
}
굳
- xcode에서 주석처리 단축기는 커맨드+백슬래시다.
기호적 상수와 전처리기
우선 반지름을 입력해서 원의 둘레와 넓이를 구하는 프로그램이다.
#include <stdio.h>
int main()
{
float radius, area, circum;
printf("Input radius\n");
scanf("%f", &radius);
area = 3.141592f * radius * radius;
circum = 2.0 * 3.141592f * radius;
printf("Area is %f\n", area);
printf("Circumference is %f\n", circum);
return 0;
}
여기서 더 친절한AI sleepybird를 넣고 기호상수를 이용해 코드를 만들어 보자.
첫번째, 전처리기로 기호상수 설정
#include <stdio.h>
#define PI 3.141592f //전처리기로 기호상수를설정
#define AI_NAME "sleepybird" //문자열을 기호상수로 할때는 큰따옴표를 붙여준다
int main()
{
float radius, area, circum;
printf("Hi, I'm %s\n", AI_NAME); //출력문 안에 실수로 AI_NAME을 그대로 넣으려 했다 꼭 문자열 넣을때 스트링넣고 쉼표하고 넣자.
printf("Please, Input radius\n");
scanf("%f", &radius);
area = PI * radius * radius;
circum = 2.0 * PI * radius;
printf("Area is %f\n", area);
printf("Circumference is %f\n", circum);
return 0;
}
두번째, 자료형앞 const입력
#include <stdio.h>
//#define PI 3.141592f //전처리기로 기호상수를설정
//#define AI_NAME "sleepybird" //문자열을 기호상수로 할때는 큰따옴표를 붙여준다
int main()
{
const float PI = 3.141592f;
const char AI_NAME[] = "sleepybird";
float radius, area, circum;
printf("Hi, I'm %s\n", AI_NAME); //출력문 안에 실수로 AI_NAME을 그대로 넣으려 했다 꼭 문자열 넣을때 스트링넣고 쉼표하고 넣자.
printf("Please, Input radius\n");
scanf("%f", &radius);
area = PI * radius * radius;
circum = 2.0 * PI * radius;
printf("Area is %f\n", area);
printf("Circumference is %f\n", circum);
return 0;
}
printf함수의 변환 지정자들
%f, %s 이런게 변환 지정자였다.
명칭도 모르고 쓰고있었다니... 반성
오늘은 여기까지..