내가 지정한 디렉터리의 파일을 가져오고 싶을 떄는 io.h에 정의 된 _finddata_t 구조체를 사용한다. _finddata_t 구조는 다음과 같은 요소가 포함 되어있다. unsigned attrib 파일의 특성 time_t time_create 파일 작성 (-1L FAT 파일 시스템에 대한) 시간 time_t time_access 마지막 파일 액세스 (–1L FAT 파일 시스템에 대 한) 시간 time_t time_write 파일에 마지막으로 쓴 시간 _fsize_t size 길이 (바이트) char name [ _MAX_PATH] 파일의 이름입니다. 위 파일을 가져올 구조체를 활용해서 다음 아래의 함수를 이용해, 쉽게 파일 목록을 받아올 수 있다. _findfirst검색 하고자하는 파일목록의 첫번..
아래 함수들은 문자만을 처리할 때 자주 사용되는 함수들이다. int isalpha(int) 영문자인 경우 1, 아닌 경우 0를 리턴한다. int isupper(int) 영문 대문자를 검사한다. 다른 문자 또는 소문자 인 경우 모두 0을 리턴한다. int islower(int) 영문 소문자를 검사한다. 다른 문자 또는 대분자 인 경우 모두 0을 리턴한다. int isdigit(int) 0~9 의 숫자를 검사한다. 숫자가 아니면 0을 리턴한다. int isspace(int) 공백을 검사한다. int isalnum(int) 영문과 숫자를 검사한다. (0~9, A~Z, a~z) int toupper(int) 영문 소문자를 대문자로 변환한다. int tolower(int) 영문 대문자를 소문자로 변환한다. int..
exit() 시스템 API를 사용하면, 진행 중인 프로그램을 멈출 수 있다. 어떤 동작 중에 에러나 뜻하지 않은 경우 프로그램을 개발자가 직접 종료시킬 수 가 있는데, 그때 exit()를 사용해서 종료할 수 있다. void exit( int status ); exit()의 선언된 내용을 보게되면, 인자값으로 status를 넘겨줘야한다. status를 넘기는 값으로는 정상적인 종료인 경우 0으로 설정하고, 에러를 나타내기위한 종료인경우 (비정상적인 종료)에는 그 외 다른 값으로 표시한다. #include #include void error(char *msg){ FILE *f; fopen_s(&f, "exit.txt", "w+"); fprintf(f, "종료 원인 : %s", msg); printf("종료 ..
memset()는 메모리를 초기화 시켜주는 함수이다. for() 이나 while과 같이 직접 하나하나 초기화시키는 방법보다 간결하고 빠른 방법으로, 다음과 같이 선언 되어있다. memset(_Out_writes_bytes_all_(_Size) void * _Dst, _In_ int _Val, _In_ size_t _Size); 3개의 인자가 필요하며, 첫 번째인자는 첫 번째 주소, 두 번째인자는 1바이트 값, 세 번째인자는 초기화할 크기를 나타낸다. 다음과 같은 코드가 있다. #include #include #include #define SIZE 10 int main(){ int *arr = (int *)malloc(sizeof(int) * SIZE); int i; memset(arr, 0, sizeof..
strstr() : 문자열 안에 어떤 문자열을 찾는다. (결과는 찾은 위치의 주소) #include #include void main(void) { char str1[] = "programmer"; char gram[] = "gram"; char *result = strstr(str1, gram); if(result != NULL){ printf("index : %d, ", result - str1); printf("%s를 찾았습니다.\n", result); } else { printf("해당 문자열을 가지고 있지 않습니다.\n"); } } strchr() : 문자열 안에 어떤 문자의 위치를 찾는다. (결과는 찾은 위치의 주소) #include #include void main(void) { char s..
일반적인 포인터는 자료형을 가지고있다. 할당된 메모리 공간과 어떻게 접근할지를 알려주기 위해 다음과 같이 포인터에 자료형을 적게된다. 하지만, void형 포인터는 간접접근방식을 정하지 않고, 오로지 메모리 주소만 저장하게 된다. #include void main(void) { int k = 24; int *ptr = &k; printf("%d\n", *ptr); } 다음과 같이 접근방식으로 타입캐스팅하면, 사용할 수 있다. #include void main(void) { int k = 24; void *ptr = &k; printf("%d\n", *(int *)ptr); }
scanf_s는 scanf의 보안에 더 효과적인 방법이다. 사용방법의 차이는 scanf_s는 char 또는 *char를 사용할 때 버퍼크기를 인자로 더 보내야 한다. #include int main(){ char k[10]; scanf_s("%9s", k, 10); printf("%s", k); return 0; } 다음 코드에서는 '\0'을 제외하고 9개의 문자를 받는다. 하지만, 버퍼크기를 주지 않으면, 출력이 되지않는다. 이렇게 한 이유는 buffer overrun이나 buffer overflow같은 것을 이용한 공격을 방어하기 위함이라고 한다.
C언어에서 매크로는 #define지시자를 통해 만들 수 있다. 매크로는 일반함수와는 다르게 프로그램이 컴파일 되기 전에 변경하게 된다. 다음과 같은 코드가 있다. #include #define CAL(x) x*2-1 int main(){ printf("%d\n", CAL(5) ); return 0; } 이 코드를 컴파일하게 되면, 값이 printf("%d\n", x*2-1 ); 으로 변경된다. 하지만, 이 코드에는 문제가 있다. 만약, 다음과 같다면 어떻게 될까? #include #define CAL(x) x*2-1 int main(){ printf("%d\n", CAL(5) * CAL(5)); return 0; } 보통 5*2-1 = 9이므로, 9*9 = 81을 예상하게 된다. 하지만, 매크로는 CAL..
헤더를 추가할때, #include또는 #include "mydef.h"와 같이 쓰게 된다. 어떤 경우에는 꺾쇠괄호를 사용하고 어떤 경우는 큰 따옴표를 사용할까? 꺾쇠괄호는 표준 헤더파일에 사용한다. 꺾쇠를 사용했을때, 컴파일러는 현재 디렉터리에서 파일을 찾지 않고, 표준 헤더 디렉터리에서 찾는다. 그렇기 때문에 지역 헤더 파일로 프로그램을 컴파일하기 위해서는 큰 따옴표를 사용해서 표기해야한다. 관련 예시> #include #include"mydef.h" int main(){ const char* value = printMydef(); printf("%s\n", value); return 0; } mydef.h #pragma once; const char* printMydef(); mydef.c #incl..
- Total
- Today
- Yesterday