묻공러
'분류 전체보기' 카테고리의 글 목록 (37 Page)

분류 전체보기

C/[코드조선] C 핵심

[C] 메모리 구조

메모리 구조 메모리 구조는 크게 스택 메모리, 힙 메모리, 코드섹션, 데이터섹션으로 나뉜다 코드섹션 코드 섹션은 프로그래머가 작성한 소스코드들이 저장되는 곳이다 데이터섹션 데이터섹션은 전역 변수와 정적 변수 등이 저장되는 곳이다 총 3가지로 구분된다 1. Initialized Data Section (초기화된 데이터 영역) 초기값을 가지는 전역 변수 및 정적 변수가 저장된다 2. Uninitialized Data Section (BSS 섹션, 초기화되지 않은 데이터 영역) 초기값을 가지지 않는 전역 변수 및 정적 변수가 저장된다 프로그램 실행 시 이 영역의 변수들은 0 또는 NULL과 같은 기본값으로 초기화된다 3. Read-Only Data Section (상수 데이터 영역 또는 Const Data S..

C/[코드조선] C 핵심

[C] 문자열 정렬

문자열 정렬 2차원 문자 배열을 사전순 기준으로 오름차순과 내림차순 정렬을 구현하는 예시이다 stdlib.h의 qsort() 함수를 활용해서 풀 수 있으며, qsort()는 콜백 함수 관련이 있다 #include #include #include enum { WORDS_LENGTH = 6 }; int compare_words(const void* lhs, const void* rhs); int compare_words_desc(const void* lhs, const void* rhs); int main(void) { size_t i; const char* words[WORDS_LENGTH] = { "premium", "level", "cultured", "moaning", "skinny", "curve"..

C/[코드조선] C 핵심

[C] strrev()

strrev() 인자로 전달받은 str 문자열의 순서를 뒤집어서 반환하는 함수이다 strrev() 구현 #include enum { LENGTH = 16 }; size_t my_strlen(const char* str); char* my_strrev(char* str); int main(void) { char string[LENGTH] = "11-40-2202"; printf("%s\n", string); my_strrev(string); printf("%s\n", string); return 0; } size_t my_strlen(const char* str) { size_t i; for (i = 0; *str++ != '\0'; ++i) {} return i; } char* my_strrev(char..

C/[코드조선] C 핵심

[C] strtolower(), strtoupper()

strtolower(), strtoupper() 대소문자를 변경하는 함수로 코딩 테스트에서 자주 등장한다 전달 받은 문자열을 모두 소문자, 혹은 모두 대문자로 바꾸는 함수이다 strtolower(), strtoupper() 구현 #include #include int is_alpha(int c); int to_upper(int c); int to_lower(int c); void string_toupper(char* str); void string_tolower(char* str); int main(void) { char str[15] = "Welcome to C"; printf("Is space alphabet?: %s\n", is_alpha(' ') ? "Yes" : "No"); printf("m i..

C/[코드조선] C 핵심

[C] strcat(), strstr(), strtok()

strcat() dst 문자열 뒤에 src 문자열을 덧붙인다 dst 문자열의 NULL 캐릭터가 있는 위치부터 src 문자열을 추가한다 따라서, dst의 크기가 충분하지 않다면 위험한 함수이다 strcat() 사용예시 #include #include #define LENGTH (20) int main(void) { char string1[LENGTH] = "Hello, "; char string2[LENGTH / 2] = "Hello, "; const char* string3 = "world!"; printf("sizeof(string1): %zu\n", sizeof(string1)); printf("sizeof(string2): %zu\n", sizeof(string2)); printf("sizeof(s..

C/[코드조선] C 핵심

[C] strcpy()

strcpy() vs. strncpy() - strcpy() strcpy 함수는 널 종단 문자 ('\0')를 만날 때까지 src 문자열의 전체 문자를 dst 문자열로 복사한다 만약 src 문자열의 길이가 dst 문자열의 버퍼 크기보다 크면, 버퍼 오버플로우가 발생할 수 있다 strcpy는 보통 null 종단 문자를 복사하지 않아도 되는 경우에 사용한다 - strncpy() strncpy 함수는 두 번째 매개변수로 지정된 길이까지만 src 문자열을 dst 문자열로 복사한다 만약 src 문자열의 길이가 두 번째 매개변수로 지정한 길이보다 크면, 나머지는 null 종단 문자로 채워지지 않는다 명시적으로 지정된 길이까지만 복사하며 나머지는 null 종단 문자로 채우지 않기 때문에, 버퍼 오버플로우를 방지하는 데..

C/[코드조선] C 핵심

[C] strcmp()

strcmp() vs. strncmp() vs. int strncmp() - strcmp() strcmp 함수는 두 문자열을 비교하여 동일한지 여부를 확인한다 비교할 두 문자열이 완전히 동일하면 0을 반환하고, 첫 번째로 다른 문자의 ASCII 값에 따라 음수 또는 양수를 반환한다 - strncmp() strncmp 함수는 두 문자열 중에서 처음부터 n개의 문자까지 만을 비교한다 두 문자열이 동일한 경우 0을 반환하고, 동일하지 않은 경우 두 문자열의 첫 번째 다른 문자의 ASCII 값에 따라 음수 또는 양수를 반환합니다. strncmp은 주로 특정 길이만큼의 문자열을 비교할 때 사용된다 - int strncmp() int strncmp은 반환 값이 int로 명시되어 있는 strncmp 함수이다 strn..

C/[코드조선] C 핵심

[C] strlen()

strlen() vs. strnlen() vs. strnlen_s() - strlen() strlen 함수는 null 종단 문자('\0')가 나타나기 전까지의 문자열 길이를 측정한다 하지만 null 종단 문자 이후의 메모리를 읽기 시작할 경우, undefined behaviour를 초래할 수 있다 - strnlen() strnlen 함수는 첫 번째 매개변수로 전달된 문자열에서 최대한으로 지정된 길이까지만 검사한다 null 종단 문자 이전에 지정된 최대 길이에 도달하면 검사를 중단하고 그때까지의 길이를 반환한다 strnlen은 C99 표준에서 도입되었고 많은 C 라이브러리에서 사용 가능하다 - strnlen_s() strnlen_s는 C11 표준에서 도입된 안전한 함수로 strnlen의 개선버전이다 추가적..

C/[코드조선] C 핵심

[C] 포인터

참조 vs. 역참조 참조: 포인터를 의미하며, 변수의 값을 직접 다 들고 있는 게 아니라, 메모리 주소를 읽는 것 역참조: 변수의 값을 직접 읽는 것이 아니라, 메모리 주소를 통해 타고 가서 값을 읽는 것 // 직접 접근 int score = 100; score = 50; // 간접 접근 int score = 100; int* ptr_to_score = &score; // 포인터를 통해 참조 *ptr_to_score = 50; // 역 참조 연산자(*)를 통해 역참조 NULL 포인터 NULL 포인터는 아래와 같은 경우에 사용한다 1. 포인터의 초기화 2. 포인터가 더이상 사용 중이지 않음을 알리고 싶을 때 ptr = NULL; 3. 포인터가 유효한 메모리 주소를 참조하고 있는지 확인할 때 if (NULL..

C/[코드조선] C 핵심

[C] 재귀 함수 (Resurcive Function)

재귀 함수(Resurcive Function) 함수 내에서 자기 자신을 호출하는 함수를 의미한다 #include void recur(int count); int main(void) { recur(3); return 0; } void recur(int count) { printf("%d\n", count); if (1 == count) { return; } recur(count - 1); } 재귀 함수의 핵심 재귀 함수 속 return의 위치와 재귀 함수 속 함수가 호출되는 위치가 매우 중요하다 다시 말해, 재귀 함수 속 return의 위아래로 어떤 코드를 작성하느냐, 함수 호출 위 아래로 어떤 코드를 작성하느냐에 따라 결과물이 달라진다 #include void recur(int count); int ma..