변수들, 파일분할

·2023년 3월 10일
0

C

목록 보기
8/13

📌변수의 유효범위


전역변수

어느곳에서도 사용가능
정의시 자동으로 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

<>

감싸는 헤더파일은 컴파일러에서 기본지원

""

감싸는 헤더파일은 사용자가 제작한 헤더파일


📌파일분할해서 사용(헤더파일, 전처리기)


human.h

  • 열거형, 구조체, 함수의 원형(사람구조체 초기화, 출력)
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);	//함수의 원형

human.c

  • 사람구조체 초기화 함수, 출력함수
#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;
}

str.c

  • 문자열 비교 함수
#include "str.h"

char copy_str(char* str1, char* str2)
{
	while (*str2)
	{
		*str1 = *str2;
		str1++;
		str2++;
	}

	*str1 = '\0';

	return 1;
}

str.h

  • 함수의 원형(문자의 비교)
char compare(char* str1, char* str2);

main.c

  • 메인함수
#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

문자열 처리함수(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

#define (매크로이름) (값)

소스코드에서 매크로이름에 해당하는 부분을 값으로 채움
전처리기 부분이기 때문에 컴파일 이전에 실행

#include <stdio.h>
#define VAR 10
int main()
{
	char arr[VAR] = { "hi" }; //arr[10]과 동일하다
	printf("%s\n", arr);
	return 0;
}

이렇게 사용이 가능

#ifdef, #endif

#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;
}

#ifndef

매크로가 정의되어 있지 않다면 아랫부분 실행
if부정형인듯


참고자료

씹어먹는 C언어
개발자 지망생

profile
개인공부저장용(하루의 기록)

0개의 댓글