어느곳에서도 사용가능
정의시 자동으로 0으로 초기화
프로그램 종료시 파괴됨
{}(자기구역)밖으로 나가면 파괴된다.
#include <stdio.h>
int* function() {
int a = 2;
return &a;
}
int main() {
int* pa = function();
printf("%d \n", *pa);
}
실행은 되지만(아마 컴파일러에서 자동으로 처리해준듯)
이런 오류 메세지가 나오게 된다. 이는 {}를 벗어나도 파괴되지 않는 정적변수를 사용하여 해결하면 된다.
#include <stdio.h>
int* function() {
static int a = 2;
return &a;
}
int main() {
int* pa = function();
printf("%d \n", *pa);
}
static을 붙여준다
{}범위를 벗어나도 파괴되지 않는다.
정의시 자동으로 0으로 초기화(전역과 동일)
딱 한번만 초기화 된다(함수 실행안해도 정적변수는 이미 정의되어 있다)
프로그램 종료시 파괴된다
int function()
{
static int how_many_called = 0;
how_many_called++;
printf("function called : %d \n", how_many_called);
return 0;
}
int function2()
{
static int how_many_called = 0;
how_many_called++;
printf("function called2 : %d \n", how_many_called);
return 0;
}
int main()
{
function();
function2();
function();
function2();
function2();
function2();
function();
function();
function2();
return 0;
}
함수의 원형을 넣어준다
전역변수, 구조체, 공용체, 열거형, 일부 특정한 함수(인라인함수), 매크로를 넣어 쓴다.
컴파일 이전에 실행
된다
ex) #include
감싸는 헤더파일은 컴파일러에서 기본지원
감싸는 헤더파일은 사용자가 제작한 헤더파일
enum {MALE, FEMALE}; //열거형
struct Human { //구조체
char name[20];
int age;
int gender;
};
struct Human Create_Human(char* name, int age, int gender); //함수의 원형
int Print_Human(struct Human* human); //함수의 원형
#include <stdio.h>
#include "human.h"
#include "str.h"
struct Human Create_Human(char* name, int age, int gender)
{
struct Human human;
human.age = age;
copy_str(human.name, name);
human.gender = gender;
return human;
}
int Print_Human(struct Human* human)
{
printf("Name : %s \n", human->name);
printf("Age : %d \n", human->age);
if (human->gender == MALE)
{
printf("Gender : Male\n");
}
else if (human->gender == FEMALE)
{
printf("Gender : Female");
}
return 0;
}
#include "str.h"
char copy_str(char* str1, char* str2)
{
while (*str2)
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = '\0';
return 1;
}
char compare(char* str1, char* str2);
#include <stdio.h>
#include "human.h"
int main()
{
struct Human Lee = Create_Human("Lee", 40, MALE);
Print_Human(&Lee);
return 0;
}
ex) stdio.h, string.h
strcpy(char* str1, const char* str2)
인자값으로는 주소값을 주며 str1이 str2로 복사된다.
strncpy(char* str, const char* str2, n)
str1이 str2로 복사가 되는데 n개 만큼 복사된다
strcmp(const char* str1,const char* str2)
두 문자열이 같다면 0 다르면 0이 아닌값을 리턴
strcat(char* str1, const char* str2)
str1 뒤에 str2를 붙인다
붙일 배열 초기화 해줘야 한다.(널문자 뒤에 붙인다)
strlen(const char* str)
널문자 이전까지의 크기를 찾아온다.
문자길이 찾기(널문자 찾으면 끝난다)
strtok(char* str, char* delimiters);
str은 자를 문자열과 뒤에는 인자를 구분할 기준을 넣는다
ex) strtok(str, " ");
이렇게 여러개 쓸 수 도 있다 : ",.' "
구분자를 찾게되면 구분자에 문장의 끝을 알리는 '\0'(NULL)로 바꿔준다.
char str[] = "Block D Mask."; //구분할 문자열
char *ptr = strtok(str, " "); //첫번째 strtok 사용.
while (ptr != NULL) //ptr이 NULL일때까지 (= strtok 함수가 NULL을 반환할때까지)
{
printf("%s\n", ptr); //자른 문자 출력
ptr = strtok(NULL, " "); //자른 문자 다음부터 구분자 또 찾기
}
strtok(NULL, " ")을 사용하는 이유는 이전에 구분자를 찾았던 그 문자열 주소에서 다시 찾아달라는 의미이다. 이걸 안쓰면 첫번째만 계속 찾게된다.
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = { "hi" };
char str2[20] = { "hello every1" };
char str3[20] = { "hi" };
if (!strcmp(str1, str2))
{
printf("%s 와 %s 는 같다\n", str1, str2);
}
else
{
printf("%s 와 %s 는 다르다\n", str1, str2);
}
if (!strcmp(str1, str3))
{
printf("%s 와 %s 는 같다\n", str1, str2);
}
else
{
printf("%s 와 %s 는 다르다\n", str1, str2);
}
return 0;
}
#define (매크로이름) (값)
소스코드에서 매크로이름에 해당하는 부분을 값으로 채움
전처리기 부분이기 때문에 컴파일 이전에 실행
#include <stdio.h>
#define VAR 10
int main()
{
char arr[VAR] = { "hi" }; //arr[10]과 동일하다
printf("%s\n", arr);
return 0;
}
이렇게 사용이 가능
#ifdef //매크로이름
//매크로 이름이 정의되어 있으면 이부분 코드에 포함됨
(#else) //일반적인 if의 else생각
#endif
if처럼 사용하면 될 것 같다
#include <stdio.h>
#define A
int main()
{
#ifdef A
printf("AAAA \n");
#endif
#ifdef B
printf("BBBB\n");
#endif
return 0;
}
매크로가 정의되어 있지 않다면 아랫부분 실행
if부정형인듯