본문 바로가기
반응형

프로그래밍 언어/C 언어39

[C] [전처리기] #if #if if - else문과 비슷한 구조를 가진다. 다만 끝에 #endif 닫아주는 지시어가 존재한다. 또한 조건문에 사용되는 소괄호와 동작 내용 부분의 중괄호가 존재하지 않는다. #include #define MODE 1 #if MODE == 1 char FILE_NAME[20] = "input.txt"; #elif MODE == 2 char FILE_NAME[20] = "sample.txt"; #else char FILE_NAME[20] = "sample_input.txt"; #endif int main() { freopen(FILE_NAME, "r", stdin); } Q) if문과 같이 조건에 따른 분기처리를 하는데 굳이 #if가 존재하는 이유는? A) 조건에 부합하지 않는 경우(false)인 경.. 2021. 3. 20.
[C] calloc( ) & realloc( ) calloc( ) malloc과 같은 기능을 목적으로 하지만 인자 전달방식에 차이가 있습니다. → malloc()이 "총 120 바이트를 힙 영역에 할당해 주세요" → calloc()은 "4바이트 크기의 블록 30개를 힙 영역에 할당해주세요" 결과적으로 120바이트를 할당받는 것이기에 인자의 전달방식에 차이가 존재. void *malloc(size_t size); ex) int *arr = (int *)malloc(sizeof(int) * n); void *calloc(size_t nelem, sizeo_t elsize); : 할당된 메모리 0으로 초기화 void *realloc(void *ptr, size_t size); : 이미 할당받은 메모리에 추가 메모리 할당 (이전 메모리 주소 없어짐) void.. 2021. 3. 20.
[C] 문자열 문자열 문자열은 컴퓨터 메모리 구조상에서 마지막에 널(NULL) 값을 포함. 널 값은 문자열의 끝을 알리는 목적으로 사용 C 언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다고 보면 됩니다. // 마지막에 널 문자가 없으므로 단순 문자 배열 char arr[] = {'H', 'i', '~'}; // 마지막에 널 문자가 있으므로 문자열 char arr[] = {'H', 'i', '~', '\0'}; while(str[idx] != '\0'){ // 널문자가 없다면 끝을 알 수 없음 printf("%c", str[idx++]); } [예제] 널 문자 #include int main(void) { char str[50] = "I like C programming"; printf("%s \n".. 2021. 3. 20.
[C] 배열과 문자열 관계 배열과 문자열 관계 배열 개념을 이해하면서 문자열과도 함께 생각해 볼 수 있다. 원시적인 C 언어는 기본적으로 자체적인 문자열 자료형을 제공하지 않음. 따라서 C 언어에서는 문자(Character)를 여러 개 묶어 놓는 형태로 문자열을 표현 ▶ char형 배열을 이용해서 문자열 저장과 변경도 가능해진다. (C++에서는 자체적으로 string 자료형 제공) char str[7] = "hi dev"; // 공백 포함해서 6자 char str[] = "hi dev"; // 자동으로 크기를 결정한다. ※ 문자열의 저장을 목적으로 char형 배열을 선언할 경우에는 특수문자 '\0'이 저장될 공간까지 고려해서 배열의 길이를 결정해야 한다. 따라서, 위의 경우 글자는 6자이지만 '\0'을 포함해서 길이가 7이 되는 .. 2021. 3. 20.
[C] 배열 선언 및 초기화 배열 선언 및 초기화 배열은 자료형, 이름, 길이만 명시해서 선언한 후, 나중에 각각의 원소를 초기화해도 된다. 물론 선언과 초기화를 같이 해주어도 됩니다. int arr[5] = {1, 2, 3, 4, 5}; int arr[] = {1, 2, 3}; // 자동으로 크기가 3으로 지정된다. int arr[3] = {1}; // 나머지 원소는 0으로 채워짐 int arr[5]; // 배열만 선언하기 배열의 필요성 Q. 5개의 데이터가 필요한 경우 int a, b, c, d, e; Q. 100개의 데이터가 필요한 경우 int arr[100]; // 0~99까지의 인덱스를 이용. 배열의 원소 중에서 최댓값 찾기 INT_MIN, INT_MAX는 헤더파일에 정의가 되어 있는 것. #include #include .. 2021. 3. 20.
[C] 문자열 배열과 문자열 배열 동적 할당 문자열 배열과 문자열 배열 동적 할당 문자열의 배열을 2차원배열을 쓸 때의 문제점 C언어는 Java나 C++처럼 문자열을 다루는 string 자료형이 없다. 대신에 문자열은 널 문자로 끝나는 문자(char) 타입의 배열을 사용한다. 즉, 일련의 문자열 집합을 다루려면 문자열의 배열을 사용한다. 여러 개의 문자열을 저장하기 위해서는 2차원 문자 배열을 사용한다. char animal[5][20] = {"cat", "horse", "dog", "tiger", "eiephant"}; 위의 경우, 크기가 일정하게 고정하여 생성해야 하므로, 각 문자열의 길이가 제각각 다르다면 메모리 낭비될 수 있습니다. 그렇기에 초기 C언어에서는 2차원 배열을 사용하는 방법이 추천되지는 않았다. 문자열 포인터의 배열 문자열은 c.. 2021. 3. 20.
[C] 함수의 선언 함수의 선언 함수의 가장 큰 목적은 재활용에 있습니다. (소스의 반복을 줄일 수 있음) int Add(int x, int y){ int result = x + y; return result; } ① 반환형 ② 함수의 이름 ③ 매개변수 ④ 값의 반환 함수 선언의 경우에는 일반적으로 main문 보다 앞서 작성해야 C 컴파일러가 이를 문제 삼지 않는다. 하지만 코드 가독성상 main문의 흐름을 읽는 것이 중요하기 때문에 함수 원형(prototype)만 간단히 적을 수 있습니다. ※ 매개변수에는 매개변수의 개수 및 자료형 정보만 포함되면 됩니다. 즉, 별도 이름이 없어도 됩니다. 함수의 원형은 컴파일러에게 함수의 이름, 전달인자의 개수와 형태, 리턴값의 형태를 알려주는 역할이기 때문입니다. int Add(int.. 2021. 3. 19.
[C] 문자열 관련 함수 문자열 관련 함수 strlen() 문자열의 길이 strcmp() 문자열 A가 문자열 B보다 사전적으로 앞에 있으면 -1, 뒤에 있으면 1 strcpy() 문자열 복사 strcat() 문자열 A에 문자열 B를 더합니다. strstr() 문자열 A에 문자열 B가 어떻게 포함 여부 반환 strlen (문자열의 길이를 반환하는 함수) #include 필요 참고로 strlen 함수의 반환형은 size_t이니, 반환 값을 unsigned int형에 저장하고 %u로 출력하는 것이 정확하나 문자열이 아무리 길어도 int형에 저장이 가능하기 때문에 반환 값을 int형 변수에 저장하고 %d로 출력하는 것이 흔함. strcpy, strncpy (문자열을 복사하는 함수) strncpy()의 경우 str1에 저장된 문자열을 s.. 2021. 3. 19.
[C] 지역변수와 전역변수 변수는 선언되는 위치에 따라서 크게 『전역변수』 와 『지역변수』 로 나뉜다. 두 변수의 차이점은 메모리상에 존재하는 기간, 변수에 접근할 수 있는 범위 지역 변수 중괄호{} 내에 선언되는 변수는 모두 지역변수다. 즉, 선언된 지역 내에서만 유효 [예제 코드] 지역변수는 선언된 지역 내에서만 유효하기 때문에 선언된 지역이 다르면 이름이 같아도 문제가 되지 않는다. #include int SimpleFunc(void) { int num = 10; num++; printf("num = %d\n", num); return 0; } void main() { int num = 5; SimpleFunc(); printf("num = %d\n", num); } 함수{ } 내부에 선언된 변수를 초기화 하지 않고 접근시 .. 2021. 3. 19.
[C] static 변수 static 변수 - static 변수를 정적 변수라고 부릅니다. - 전역변수와 지역변수 모두에 static 선언을 추가할 수 있다. 하지만 static 변수는 『접근이 제한된 전역변수』를 만드는 것이기에 지역변수에 이용되는게 일반적. 지역변수에 static을 붙인 경우 - 선언된 함수 내에서만 접근이 가능한 것은 계속해서 유효하다. - But, 해당 함수가 반환되면 소멸되지 않고, 처음 한번 초기화되고 프로그램 종료 시까지 메모리 공간에 존재한다. 즉, 한번만 초기화 되는 것입니다. (전역변순의 성격을 조금 띄게 됨) #include int simpleFunc() { static int x = 0; // 초기화하지 않으면 0으로 초기화 int y = 0; // 초기화하지 않으면 쓰레기 값 초기화 x++.. 2021. 3. 19.
반응형