본문 바로가기

C언어문법20

[ C ] 전처리기 이해하기5_매크로 연산자 #, ## 정의/예제 C언어 문법 매크로 연산자 #, ## 정의/예제 아래의 매크로 문장은 어떤 결과를 만들까요? 매크로 함수: #define STRING_NAME(A, B) "A의 이름은 B이다" 매크로 문장: STRING_NAME(하헤호후, 아무개) 예상 결과: 하헤호후의 이름은 아무개이다. 진짜 결과: X (문자열 안에서는 매크로의 매개변수의 치환이 발생하지 않기 때문) 이런 상황에서 매개변수 치환이 이루어지게 하는 연산자, #이 있습니다. ■ # 연산자: 치환 #는 치환의 결과를 문자열로 구성하는 연산자입니다. #define STRING_NAME(ABC) #ABC STRING_NAME(랄랄라)라는 문장은 선행처리기에 의해 문자열 "랄랄라"로 치환됩니다. 또한 나란히 선언하면 하나의 문자열로 간주됩니다. 그래서 아래 문.. 2020. 7. 28.

[ C ] 전처리기 이해하기1_전처리기(Preprocessor)란? 정의/용도, 지시문 종류 전처리기(Preprocessor)란? 정의/용도 소스 파일에서 실행 파일로 만들어지려면 다음과 같은 과정을 거쳐야 합니다. 선행처리 거친 소스 파일이란 무엇일까요? 사실 소스 파일의 형태가 그대로 유지되기 때문에 그냥 소스 파일입니다. 선행처리기가 하는 일은 선행처리 명령문대로 소스 코드의 일부를 수정합니다. 선행 처리 명령문은 #으로 시작하며, 세미콜론(;)을 붙이지 않습니다. #define PI 3.14 이런 명령문이 삽입되어 있다면 선행처리된 소스 파일에서는 PI를 3.14로 인식합니다. #include 이제껄 자주 작성했던 #include 도 # 문자로 시작하는 선행처리 명령문입니다. stdio.h 파일의 내용을 그 파일에 옮겨놓다는 의미입니다. ■ 전처리기 지시문 종류 #include #defi.. 2020. 7. 27.

[ C ] 파일 입출력 이해하기5_파일 위치 서식자란? fseek, ftell 함수 파일 위치 서식자란? fseek, ftell 함수 FILE 구조체의 멤버 중에는 파일의 위치 정보를 저장하고 있는 멤버가 있습니다. '파일 위치 지시자'라고 부르는 이 멤버는 파일이 처음 개방되면 파일의 맨 앞부분을 가리킵니다. 그래서 파일의 중간이나 마지막에서 데이터를 읽거나 쓰고 싶다면 이 '파일 위치 지시자'를 이동시켜야 합니다. fgets 함수 호출을 통해서 파일에서 20바이트의 문자열을 읽어 들었다면 '파일 위치 지시자'는 20바이트 뒤를 가리키게 됩니다. ■ 파일 위치 지시자의 이동 fseek #include int fseek(FILE * stream, long offset, int wherefrom); stream으로 전달된 파일 위치 지시사를 wherefrom부터 offset만큼 이동시킨다.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기3_파일복사 feof/바이너리 데이터 입출력 fread, fwrite C언어 문법 파일복사 feof/바이너리 데이터 입출력 fread, fwrite ■ 파일 복사하는 함수 feof 전체 파일을 복사해야 한다면 파일의 끝을 확인하는 작업이 필요합니다. 그 때 feof함수을 사용하면 됩니다. 파일의 끝까지 읽어들인 상태이면 0이 아닌 값을 반환합니다. #include int feof(FILE * stream); 매개변수로 FILE 형 포인터를 넣으면 됩니다. ■ 바이너리(Binary) 데이터 입출력하는 함수 fread, fwrite 이번에는 바이너리 데이터를 입력, 출력할 수 있는 함수를 알아보겠습니다. ( 참고할만한 글:텍스트 데이터와 바이너리 데이터의 차이점은?) - 입력 #include size_t fread(void * buffer, size_t size, size_t.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기2_파일의 개방모드(Mode) C언어 문법 파일의 개방모드(Mode) fopen 함수의 두 번째 인자로 "wt"와 "rt"를 전달하여 스트림을 형성했습니다. 사실 스트림의 종류는 더 다양합니다. 기본적으로 두 가지 기준이 있는데 하나씩 보겠습니다. 기준 1: 읽기 위한 스트림? vs 쓰기 위한 스트림? 모드(Mode) 스트림의 성격 파일이 없으면? r 읽기 에러 w 쓰기 생성 a 덧붙여 쓰기 생성 r+ 읽기/쓰기 가능 에러 w+ 읽기/쓰기 가능 생성 a+ 읽기/덧붙여 쓰기 가능 생성 위 표를 참조하여 만들고자 하는 스트림의 특성에 맞춰 '파일의 개방 모드'를 선택하면 됩니다. 그 조합이 fopen 함수의 두 번재 인자가 됩니다. 모드의 +는 읽기, 쓰기가 모두 가능한 스트림의 형성을 의미합니다. 더 좋은 모드라고 생각할 수 있지만 수.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기1_스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets 스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets 데이터의 이동 경로가 되는 다리를 스트림이라고 했습니다. 기본적인 스트림 개념은 아래 글에서 이미 다루었습니다. 스트림과 데이터의 이동 ■ 스트림 생성 함수 FILE * fopen(const char * filename, const char * mode); 위 함수의 첫 번째 인자로는 스트림을 형성할 파일의 이름, 두번째 인자로는 형성할 스트림 종류에 대한 정보를 문자열로 전달합니다. 그러면 이 함수는 해당 파일과의 스트림을 형성하고 스트림 정보를 FILE 구조체 변수에 담아서 그 변수의 주소 값을 반환합니다. 여기서 FILE 구조체의 포인터는 파일을 가리키기 위한 용도로만 사용되었습니다. 그래서 FILE 구조체 변수의 멤버에 .. 2020. 7. 25.

[ C ]커스텀 자료형 이해하기6_열거형(Enumerated Type)란? 개념/선언방법 C언어 열거형(Enumerated Type)란? ■ 열거형 개념, 선언방법 열겨형은 변수에 저장가능한 값을 열거하여 정의합니다. 그래서 열거형 변수명을 IndianBoy로 하고 다음과 같이 값을 넣을 수 있습니다. enum indianBoy { One=1, Two=2, Three=3, Four=4, Five=5 }; IndianBoy형 변수가 저장할 수 있는 값으로는 One, Two, Three.. 라는 상수가 있으며, 각각 1, 2, 3...으로 정의하였습니다. 이 열거형 변수를 선언하려면 구조체에 struct 키워드 붙이듯이 enum 키워드를 사용하면 됩니다. enum indianBoy song1; // indianBoy형 변수 song1선언 이제 위의 열거형을 typedef 선언을 추가해서 정의한 .. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기5_공용체(Union Type)이란? 정의/사용하는 이유 C언어 공용체(Union Type)이란? 정의/사용하는 이유 ■ 공용체 정의공용체(Union Type)을 뜻하는 Union은 조합, 통합을 의미합니다. 무엇에 관한 '통합'일까요? 구조체와 공용체의 차이를 보면 쉽게 이해할 수 있습니다. 아래 코드를 확인해보겠습니다. #include typedef struct structBox { int member1; int member2; double member3; } SBox; typedef union unionBox { int member1; int member2; double member3; } UBox; int main(void) { SBox sbox; UBox ubox; printf("%d \n", sizeof(SBox); // 결과 16 printf("%.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기4_함수 반환값으서의 구조체 C언어 문법 함수 반환값으서의 구조체 기본 자료형이랑 똑같습니다. int형 변수를 인자로 전달할 수 있고, 반환값으로도 설정할 수 있듯이 구조체 변수도 마찬가지입니다. 간단한 예제를 보겠습니다. date_t get_dday(void) // 반환값이 구조체 date_t형 { date_t date; date.year = 2043; date.month = 10; date.day = 1; return date; } //main 함수에서 date_t date; date = get_dday(); // 대입 가능 C언어에서 함수는 반환값 한 개입니다. 그래서 여러 값을 반환하고 싶으면 구조체를 반환하면 됩니다. 구조체를 반환하면 실질적으로 여러 개의 값을 반환하는 격이 되니까요. date = get_dday(); 이.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기3_구조체 배열, 포인터 C언어 문법 구조체 배열, 포인터 ■ 구조체 배열 정의 및 선언 구조체 변수를 여러개 사용해야 할 때는 구조체 배열을 선언하면 됩니다. 선언방법은 일반 배열과 동일합니다. struct point pointArr[3]; // 크기 3인 point형 구조체 배열 선언 그럼 다음과 구조로 배열이 할당됩니다. ■ 구조체 배열 초기화 구조체 배열을 선언과 동시에 초기화할 때는 배열의 길이만큼 중괄호를 통해서 초기화할 값을 명시합니다. struct point pointArr[3] // 크기 3인 point형 구조체 배열 선언 { {3, 4} // 첫 번째 요소의 초기화 {2, 1} // 두 번째 요소의 초기화 {5, 9) // 세 번째 요소의 초기화 }; ■ 구조체 변수와 포인터 포인터도 구조체의 멤버가 될 수 있.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기2_typedef이란? typedef사용법 C언어 문법 typedef이란? struct과 typedef의 차이점, 사용법 구조체 변수를 선언할 때는 struct 키워드를 일일히 붙여야합니다. 구조체 Person으로 변수를 선언한다고 하면 struct Person own; struct Person two; struct Person three; 이런 식으로 'struct [구조체명] [변수명]'을 반복해야 합니다. 이런 번거로움을 덜 수 있는 typedef 구조체를 정의할 수 있습니다. typedef Person PERSON; 이렇게 선언을 하면 struct Person에 PERSON이라는 별칭(alias)을 붙여진 것입니다. 그래서 간단히 [별칭][변수명]만 작성하면 됩니다. PERSON own; PERSON two; PERSON three; 이처.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기1_구조체란? 정의/선언/용도/초기화 C언어 구조체(struct)란? 정의/선언/용도/초기화 이제까지 기본 자료형을 써왔습니다. int(4바이트)나 short(2바이트) 등등 말이죠. 그런데 3바이트짜리 자료형을 사용하고 싶으면 어떻게 해야할까요? 3바이트짜리 기본 자료형은 없습니다. 그래서 기본 자료형으로는 그 크기를 할당받을 수 없습니다. 바로 이 때 커스텀(Custom) 자료형을 활용합니다. 사용자 정의 자료형(User efined data type)이라고도 하여 우리가 새로운 자료형을 정의할 수 있다는 뜻입니다. ■ 구조체 정의 그 중 하나인 구조체에 대해 알아보겠습니다. 구조체를 선언할 때 사용하는 키워드 struct은 '건축물'을 뜻하는 영어 단어 structure을 의미합니다. 말 그대로 여러 부품을 조립하여 하나의 건축물을 이.. 2020. 7. 24.

[ C ] 문자열 함수 이해하기8_C스타일 문자열 정리 C언어 문법 C스타일 문자열, 출력 마무리 정리 참고 자료: 포프 C 언매니지드 프로그래밍 강의 164 ※ 마무리 강의 164번 내용 그대로 딕테이션 했습니다. "섹션 5 C스타일 문자열, 출력 (강의 No. 141-163)" 에 해당하는 정리 강의이며, 저는 " C 스타일 문자열 이해하기" 시리즈에 그 내용을 실었습니다. 하지만 저는 강의의 모든 내용을 다루지 않았기 때문에 이번 글에는 제가 언급하지 않은 부분이 있습니다. ■ C 스타일 문자열 문자열의 표현 방법 C 스타일의 문자열, 면접에서 많이 나오는 내용이죠. 포인터, 배열, 간단한 알고리즘을 테스트하기에 굉장히 좋은 부분이죠. C에서는 문자열 자체가 없어요. 기본적으로 문자열 형 자체가 없어요. 그래서 C는 배열을 통해서 표현하는데. 마지막에 .. 2020. 7. 23.

[ C ] 문자열 함수 이해하기7_서식 지정 출력 / 서식 문자열 / 서식 지정자 모음 C언어 문법 서식 지정 출력(formatted) / 서식 문자열(format string) / 서식 지정자 모음 ■ 서식 지정(formatted) 출력이란 C언어 학습할 때 자주 사용했던 함수 printf()가 있습니다. 가장 기본 출력 함수인데, 맨 앞 글자 f는 formatted 입니다. 포맷에 맞춘다는 것은 데이터를 특정 서식에 맞춰 출력하는 것을 의미합니다. 그래서 C언어에서는 '서식 지정 출력'이라고 합니다. 서식 지정 출력 중에서 가장 자주 사용되는 3가지를 보겠습니다. 1 printf() 콘솔창(stdout) 에 출력 2 fprintf() 스트림에 출력 3 sprintf() 문자열에 출력 1 stdout이라는게 우리가 알고 있는 커맨드창 콘솔입니다. 2 fprintf 에서 맨 앞 글자 f는 .. 2020. 7. 23.

[ C ] 문자열 함수 이해하기6_입출력 이외의 문자열 관련 함수_strlen, strcpy, strcat, strcmp C언어 입출력 이외의 문자열 관련 함수_strlen, strcpy, strcat, strcmp C언어는 문자열을 담을 수 있는 자료형이 없습니다. 그래서 char로 배열을 만들어 사용합니다. 하지만 배열만으로 전체 길이 알아내는 등 데이터를 처리하는데 번거로움이 있기 때문에 유용한 함수를 잘 활용하면 좋습니다 참고할만 한 글: C 스타일 문자열 개념 참고할만 한 글: 문자열 길이를 알 수 있는 함수 strlen ■ 문자열을 복사하는 함수: strcpy, strncpy char* strcpy(char * dest, const char * src); char* strncpy(char * dest, const char * src, size_t n); strcpy 함수는 아래와 같이 호출하면 됩니다. int m.. 2020. 7. 22.

[ C ] 문자열 함수 이해하기5_표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기 C언어 표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기 ■ 입출력 버퍼(buffer)의 개념 우리가 이제껏 공부해 온 입출력 함수들은 ANSI C의 표준에서 정의된 함수입니다. 이런 표준 입출력 함수를 통해서 데이터를 입출력하는 경우, 해당 데이터들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과하게 됩니다. 여기서 말하는 '메모리 버퍼'는 데이터를 임시로 모아두는(저장하는) 메모리 공간입니다. 위 그림을 보면 키보드를 통해 입력되는 데이터는 일단 입력버퍼에 저장된 다음에(= 버퍼링 된 다음에) 프로그램에서 읽혀지는 것을 알 수 있습니다. 즉 fgets 함수가 읽어 들이는 문자열은 입력 버퍼에 저장된 문자입니다. 그럼 언제 입력 버퍼에 데이터가 들어가는 걸까요? 바로 엔터 키.. 2020. 7. 22.

[ C ] 문자열 함수 이해하기4_문자열 단위 입출력 함수_puts, fputs, gets, fgets C언어 문자열 단위 입출력 함수 puts, fputs, gets, fgets ■ 문자열 출력 함수: puts, fputs 문자열을 출력할 때 일반적으로 두 함수를 사용합니다. #include int puts(const char * s); int fputs(const char * s, FILE * stream); // 실패 시 EOF 반환 다음 코드를 통해서 두 함수의 차이를 찾아봅시다. int main(void) { puts("How are you?"); fputs("Good,Thanks", stdout); printf("\n"); return 0; } puts 함수는 출력의 대상이 stdout으로 결정되어 있기 때문에 매개변수로 출력할 문자열만 넣으면 됩니다. fputs 함수는 두 번째 인자를 통해서 .. 2020. 7. 21.

[ C ] 문자열 함수 이해하기2_스트림과 데이터의 이동 C언어 문법 스트림과 데이터의 이동 ■ 데이터의 입출력 프로그램 중심으로 데이터가 프로그램 안으로 들어오면 입력이고, 프로그램 밖으로 나가면 출력입니다. 대표적인 입력 장치로는 키보드가 있으며, 파일도 입력의 대상이 될 수 있습니다. 대표적인 출력 장치로는 모니터가 있으며, 파일도 출력의 대상이 될 수 있습니다. ■ 스트림(stream)이란? 이제까지 C언어로 코드를 작성하고 결과값을 어떻게 출력했나요? printf 함수를 호출하였습니다. 프로그램과 키보드는 서로 떨어져 있는 개체인데 printf 함수 호출만으로 어떻게 문자열이 출력될 수 있을까요? 프로그램과 키보드를 연결해주는 다리가 있기 때문입니다. 그 역할을 하는 매개체를 '스트림'이라고 합니다. 스트림이란 운영체제에서 제공하는 가상의 다리입니다... 2020. 7. 21.

[ C ] 문자열 함수 이해하기1_C 스타일 문자열이란? / 문자열 길이 구하기 C언어 문법 C 스타일 문자열이란? ■ C 스타일 문자열 개념 기본 자료형 배울 때 가장 먼저 언급하는 부분이 그 자료형의 크기(표현할 수 있는 범위)입니다. 기본 자료형의 크기는 특정 플랫폼마다 항상 고정되어 있습니다. int num = 4 // 4바이트 (32bit) double num2 = 1.2 //8바이트 (64bit) 이런 식으로 말이죠. 그럼 다음 문장을 대입할 변수 크기는 얼마로 설정하면 될까요? "I have no idea at all" 일단 저장하고 싶은 데이터는 문장입니다. 여러 문자가 모인 문자열인거죠. 다른 프로그래밍 언어를 배운적이 있는 분이라면 문자열을 표현할 수 있는 자료형 Stirng(JAVA) 생각날 수도 있을 것입니다. 하지만 C언어에는 문자열을 표현할 수 있는 따로 자.. 2020. 7. 21.

C언어 문법 총정리_프로그래밍 독학이나 컴퓨터공학과를 준비하는 분을 위한 C언어 독학이나 컴퓨터공학과를 준비하는 자를 위한 예습용, 복습용 C언어 문법 총 정리 학습자료: 윤성우 열혈C프로그래밍, 포프 C 언매니지드프로그래밍 ■ C 언어를 배워야 하는 이유 '머신러닝은 파이썬, 데이터 통계는 R'이라고 주장하며 '00일만에 개발자 되기'를 광고하는 일명 코딩 교육 사이트들이 많습니다. 또한 C언어는 옛날 언어라며 그런 언매니지드(unmanaged) 언어는 가까운 미래에 더이상 쓰이질 않을 것이라고 합니다. 하지만 이 모든 주장들은 사실은 아닙니다. C언어는 TIOBE 지수(프로그래밍 언어 순위)로 2019년에는 2위였다가 현재 2020년은 1위 입니다. 티오베 사이트 : tiobe.com/tiobe-index/ C언어는 2001년 이후 언제나 1위 아니면 2위했던 언어입니다... 2020. 7. 21.