C Programming 23

C언어 구조체 연결 리스트 - 공부하는 도비

연결 리스트란, 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료 구조입니다. 아래 그림처럼 Link 필드(포인터 필드)에 다음이나 이전 노드의 주소 값을 저장하여 각 노드를 연결합니다. 오늘은 구조체를 사용하여 연결 리스트를 구현해보겠습니다. C언어에서 연결리스트의 노드 종류는 크게 머리 노드와 일반 노드로 나뉩니다. - 머리노드(head node) : 단일 연결 리스트의 기준점이며, 첫 번째 노드를 가리키는 용도로 사용됩니다. 이 노드엔 데이터를 저장하지 않습니다. - 일반 노드 : 연결 리스트에서 데이터가 저장되는 실제 노드를 의미합니다. 맨 마지막 노드의 Link 필드엔 NULL 값이 들어갑니다. 구조체를 이용하여 연결 리스트 구현 #include #inc..

C Programming 2022.11.23

문자열 복사 (strcpy) - 공부하는 도비

C언어에는 문자열을 복사하는 함수 strcpy가 있다. 파이썬을 쓰다가 오랜만에 C를 쓰려고 하니, 파이썬에서 쉽게 되던 문법이 C언어에선 작동 안 되는 경우가 많다. 예를 들어, 아래 코드 처럼 두 문자열 a, b가 있을 때 b = a 또는 a = b 를 해도 문제가 없다. # 파이썬 문자열 복사 a = 'Dobby' b = 'Free' print("a의 문자열 : %s" %a) print("b의 문자열 : %s\n" %b) print("!! a를 b에 복사 !!") b = a print("복사된 b의 문자열 : %s" %b); 하지만, C에서 저런 문법을 썼다가는 아래와 같은 오류가 발생한다. (error: assignment to expression with array type) 파이썬처럼 문자열을..

C Programming 2022.11.22

문자열 비교 (strcmp) - 공부하는 도비

C언어에는 문자열을 비교해주는 함수 strcmp가 있습니다. 아래 표처럼, 입력된 두 문자열이 같다면 0이 출력됩니다. 만약, 두 문자열이 다른 경우에는 입력된 문자열의 첫 번째 알파벳의 사전적 순서에 따라 출력 결과가 달라집니다. 첫 번째 배열의 사전적 순서가 두번째 보다 빠르면 -1을 출력하고, 그렇지 않다면 1을 출력합니다. #include #include int main() { char input_1[10] = "A"; char input_2[10] = "A"; printf("문자열 비교 : %d", strcmp(input_1, input_2)); return 0; } #include #include int main() { char input_1[10] = "A"; char input_2[10] ..

C Programming 2022.11.22

C언어 문자열 길이 출력 (strlen) - 공부하는 도비

오늘은 문자열을 입력받고 그 문자열의 길이를 출력해보겠습니다. 문자열의 길이를 출력하는 방법엔 크게 두 가지가 있는데, 하나는 count를 올리면서 입력된 문자열의 길이를 출력하는 것이고, 나머지 하나는 strlen 함수를 사용하는 것입니다. C언어에서는 문자열의 맨 마지막 인덱스에 NULL 값이 저장되는 약속이 있습니다. 이 정보를 이용하여 길이를 출력해보겠습니다. #include int main() { char input[1000]; // 엔터가 입력될 때까지, 문자열을 입력 받음 gets(input); int count = 0; // 문자열의 맨 마지막 인덱스에는 Null('\0') 값이 저장됨 while (input[count] != '\0') { count++; } printf("입력한 문자열의..

C Programming 2022.11.22

C언어 2차원 배열 동적 메모리 할당 후, 두 행렬의 곱 출력 - 공부하는 도비

사용자로부터 (n *n) 크기의 정방 행렬 두 개를 입력받은 후, 두 행렬의 곱(Matrix Multiplication) 출력 ● 입력 : 정수 하나를 입력 받음 2를 입력하면, (2 * 2) 행렬 2개에 대한 정수를 입력해야하므로, 각각 4가지 원소, 즉 8개 입력 4를 입력하면, (4 * 4) 행렬 2개에 대한 정수를 입력해야하므로, 각각 16가지 원소, 즉 32개 입력 ● 출력 : 입력한 두 행렬의 곱을 계산 후 출력 ● 예시 입력 ● 소스코드 #include #include int main(void) { int num; int sum_value = 0; int temp = 0; int **arr; printf("행렬의 크기 (n X n) => n : "); scanf("%d", &num); arr..

C Programming 2022.11.06

C언어 2차원 동적 메모리 할당 - 공부하는 도비

오늘은 2차원 배열을 선언하는 것처럼,2차원 동적 메모리 할당에 대해 알아보겠습니다. 지난 피드에서 C언어 동적 메모리 할당을 알아보았습니다. 자세한 내용은 아래 링크를 참고해주세요. 2022.11.06 - [C언어] - [C언어] 동적 메모리 할당을 통해 배열처럼 사용하기(mallloc(), calloc()) - 공부하는 도비 [C언어] 동적 메모리 할당을 통해 배열처럼 사용하기(mallloc(), calloc()) - 공부하는 도비 동적 메모리 할당 (Dynamic Memory Allocation) 프로그램 실행 도중 필요한 만큼 힙(heap) 영역의 메모리를 할당 받아 사용하는 방식입니다. 동적 메모리 할당시에는 malloc() 함수와 calloc() 함수가 있는데, yang-wistory1009...

C Programming 2022.11.06

동적 메모리 할당을 통해 배열처럼 사용하기(mallloc(), calloc()) - 공부하는 도비

동적 메모리 할당 (Dynamic Memory Allocation) 프로그램 실행 도중 필요한 만큼 힙(heap) 영역의 메모리를 할당 받아 사용하는 방식입니다. 동적 메모리 할당시에는 malloc() 함수와 calloc() 함수가 있는데, 우선 malloc()을 먼저 보겠습니다. 1. malloc() 하나의 인자로 할당 메모리 크기를 결정하고, 메모리 할당을 해제하기 위해선 free() 함수를 사용합니다. malloc()과 free() 함수 모두 stdlib.h 헤더 파일에 정의되어있어, 두 함수를 사용시 해당 헤더파일을 포함시켜야합니다. 아래 그림은 malloc을 사용하여 크기 3만큼의 메모리를 할당받는 예 입니다 . 동적할당을 마치 배열 처럼 사용할 수 있는데요, 아래 예시 코드를 살펴보겠습니다. ..

C Programming 2022.11.06

C언어 레지스터 변수 - 공부하는 도비

C언어를 사용하며 선언한 대부분의 변수는 메모리의 일정 공간을 할당받아 변수를 선언하고, 연산을 위해 CPU 내부 레지스터(register)로 복사되어 연산을 수행합니다. 또한, 저장이 필요한 경우 다시 레지스터 값을 메모리에 저장을 합니다. 따라서, 메모리를 읽어 레지스터로 복사하는 과정과 다시 레지스터에서 변경된 값을 메모리에 쓰는 과정이 필요합니다. 이러한 과정을 거치지 않기 위해서 C언어는 레지스터 변수라는 것을 사용합니다. 레지스터 변수 메모리가 아닌 레지스터 공간에 할당하여 사용하는 변수 레지스터 변수의 가장 큰 장점은 메모리 접근이 이뤄지지 않기 때문에, CPU 내부에서 빠른 연산을 통한 프로그램 전체 성능에 도움을 줍니다. 아래 그림처럼, 일반적인 변수는 선언한 변수가 메모리의 일부분에 저..

C Programming 2022.11.06

C언어 전역 변수, 지역 변수, 외부 변수 - 공부하는 도비

프로그래밍 수업을 할 때 학생들이 지역/전역 변수를 헷갈려해 아래와 같은 코드를 두고, 왜 오류가 나는지 묻는 경우가 있습니다.. 그래서 이 내용에 대해 정리를 좀 해두려고 합니다. 아마 main() 함수 안에 정의한 a, b를 당연히 sum() 함수에서 쓸 수 있다고 생각하는 거 같습니다. ㅜㅜ #include int sum(int p, int q) { return a + b + p + q; } int main() { int a = 10; int b = 20; int c = 100; int d = 200; printf("%d", sum(c, d)); return 0; } C언어의 변수에는 지역 변수, 전역 변수, 그리고 외부 변수로 크게 3가지로 나눌 수 있습니다. (정적, 레지스터 변수로도 나눌 수 ..

C Programming 2022.11.06