-
Re : 우당탕탕 맞으면서 배우는 C언어Language/C, C++ 2022. 9. 8. 10:00728x90
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++; }
C언어- 수 여러개를 입력해서 수 개수만큼 리스트에 저장하기 - SHA Computing
오늘 만들어 볼 것은 아래의 사진과 같습니다! 문자열을 입력하면 띄어쓰기로 구분해서 정수형 리스트에 저장하기!! 위에서는 수 입력을 5번 했지만 10번했다면 정수형 리스트의 […]
shacoding.com
마무리
C 열심히 하자!
728x90