컴퓨터를 공부하고자 마음먹은지 N일차

[6일차] (홍정모의따배c)문자열과 형식맞춘 입출력-1 본문

🖥C

[6일차] (홍정모의따배c)문자열과 형식맞춘 입출력-1

졸린새 2020. 9. 14. 04:53
728x90

[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 이런게 변환 지정자였다.

명칭도 모르고 쓰고있었다니... 반성

출처- 인프런(홍정모의 따라하며 배우는 c)

오늘은 여기까지..

Comments