ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Re : 우당탕탕 맞으면서 배우는 C언어
    Language/C, C++ 2022. 9. 8. 10:00
    728x90

    2017년 컴퓨터과학과에 진학해서 C를 처음 배웠다. 1학기 동안 즐겁고 토나오게 배우고 다시는 C를 안 보겠다 다짐했었다. Python, Java만 있으면 아무것도 두렵지 않았다.....

     

    그러나 C를 다시 잡게 되었다

    옛날 옛적 전공책과 오래된 기억을 더듬어가며 C 코드를 짰는데

    우당탕탕 맞으면서 배웠다.

     

    오늘 코드를 짜며 겪은 우여곡절을 정리해보았다.

     

    1. scanf()

     

    처음에 이게 안 되서 해맸다. 아래 C 코드의 문제는 무엇일까?

    // 문제 1. C scanf
    
    int size = 5;
    size = scanf("%d", &size);
    
    printf("%d", size)

    철수는 위 코드를 실행하여 콘솔 창에 10을 입력하였다.

    코드의 출력값은 무엇일까?

     

    답은 1이다.

     

    scanf()가 잘 실행됐기에 참 값(True, 1)이 size에 저장된다...

     

    Python 코드에 너무 익숙해져서 기본 중의 기본을 틀린 것이다.

    # 문제 1, Python
    
    size = 5
    size = int(input())
    
    print(size)
    // 문제 1. 올바른 사용법
    
    int size = 5;
    scanf("%d", &size);
    
    printf("%d", size)

     

    2. 가변 길이 배열 (Variable-length array, VLA)

     

    C가 이런 것도 안 된다는게 놀랐다. 아래 C 코드의 문제점은 무엇일까?

    // 문제 2. VLA
    
    int size;
    scanf("%d", &size);
    
    int arr[size] = {0, };

    철수는 위 코드를 실행하여 콘솔 창에 10을 입력하였다.

    코드의 출력값은 무엇일까?

     

    정답은.. "IDE에 따라 컴파일 할 수 없다." 입니다.

    🐳배열에만 초점을 맞추면 문제를 풀 수 없습니다. 핵심을 봐야 해요. 🐳

     

    VLA는 C99 표준부터 들어간 문법으로 변수로 배열의 길이를 정할 수 있다.

    그러나 VLA는 치명적인 단점 때문에 C11부터 조건부 기능으로 강등되었다.

     

    먼저 VLA의 장점은

    1. 프로그래밍 단순화.

    malloc-free으로 동적 할당을 안 해도 되니 매우매우 편하다.

    2. 사용자 편의성

    VLA는 stack으로 관리하기 때문에 메모리 관리에 신경 쓸 필요없다.

     

    하지만 장점 2번 때문에 치명적인 단점이 존재한다.

     

    그것은 바로 Stack Overflow

    변수가 stack 메모리보다 큰 값이고, 이 크기만큼 배열이 선언된다면...? ㄷㄷ

     

    조건부 기능으로 강등당한 이유가 이것이다.

     

    그 대신 동적 할당(heap)으로 배열을 만들어야 한다.

    // 문제 2. 동적할당
    
    int size;
    scanf("%d", &size);
    
    // 동적 할당으로 size길이의 배열 생성
    int *arr = (int *)malloc(sizeof(int) * size);
    
    int arr[size] = {0, }; // ← 이거(VLA) 는 안 됨... 쥐엔장 !

     

    3. 띄어쓰기로 구분된 숫자 배열로 입력받기

    Python은 한 줄로 하는데 C는 상당히 복잡하다.. 

    이것은 따로 포스팅할 예정. 

    # 문제 3. Python
    numbers = list(map(int, input().split()))

    출처: https://baemsul.tistory.com/23

     

    [Python] 한 줄로 된 숫자를 리스트로 입력받는 법

    numbers = list(map(int, input().split())) 맨날 할 때마다 까먹어서 블로그에 적음

    baemsul.tistory.com

    // 문제 3. C
    
    char str[10000];
    int size, cnt = 0;
    
    scanf("%d", &size); // 수 넣을 배열의 크기
    int *arr = (int *)malloc(sizeof(int) * size); // size 길이의 배열 생성
    
    scanf("%*c"); // 버퍼 에러 예방
    scanf("%[^\n]s", str); // 공백문자 포함 문자열 입력
    
    char *box = NULL; 
    box = strtok(str, " ");
    
    while (box != NULL)
    {
        arr[cnt] = atoi(box);
        box = strtok(NULL, " ");
        if (box != NULL)
            cnt++;
    }

    출처: https://shacoding.com/2019/08/01/c%EC%96%B8%EC%96%B4-%EC%88%98-%EC%97%AC%EB%9F%AC%EA%B0%9C%EB%A5%BC-%EC%9E%85%EB%A0%A5%ED%95%B4%EC%84%9C-%EC%88%98-%EA%B0%9C%EC%88%98%EB%A7%8C%ED%81%BC-%EB%B0%B0%EC%97%B4%EC%97%90-%EC%A0%80%EC%9E%A5/

     

    C언어- 수 여러개를 입력해서 수 개수만큼 리스트에 저장하기 - SHA Computing

    오늘 만들어 볼 것은 아래의 사진과 같습니다! 문자열을 입력하면 띄어쓰기로 구분해서 정수형 리스트에 저장하기!! 위에서는 수 입력을 5번 했지만 10번했다면 정수형 리스트의 […]

    shacoding.com

     

    마무리

    C 열심히 하자!

    728x90

    댓글

안녕하세요? 반가워요. 광고 눌러주세요?