반응형

C언어에서 표준으로 지정된 입력스트림, 출력스트림이 있다.

 

보통 "키보드"의 입력을 통해 받으니 입력스트림이다. (stdin)

보통 "모니터"로 결과를 확인하니 출력스트림이다. (stdout)

그 외 default로 "모니터"출력으로 설정된 에러스트림이 있다. (stderr) -> (필요에 따라 출력을 파일로 스트림을 변경가능)

반응형

 

문자(character)를 1개만 입력받는 함수 getchar

 - 함수 원형: int getchar(void)

 - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signed가 다른데, int는 모든 컴파일러가 signed int로 처리함.

 - int형 이므로 어떤 컴파일러든 -1값을 반환하는데 무리가 없다.

 

문자(character)를 1개만 출력하는 함수 putchar

#include <stdio.h>

int main()
{
	int ch1;

	// 문자(character) 1개만 입력받아 저장
	ch1 = getchar();

	// 1개의 문자만을 출력
	putchar(ch1);

	return 0;
}

(결과)

어떤 문자들을 넣어도, 제일 처음에 입력된 문자만 ch1에 저장되며, 해당 문자 1개만 출력된다.

 

 

#include <stdio.h>

int main()
{
	int ch2;

	// fgetc는 뒤에 인자로 stdin을 택하면 키보드, 그 외 다른 파일을 읽는 것과 같은 입력 인자를 넣을 수 있다.
	ch2 = fgetc(stdin);

	// fputc는 뒤에 인자로 stdout을 택하면 모니터, 그 외 파일으로 출력인자를 선택할 수 있다.
	fputc(ch2, stdout);

	return 0;
}

(결과) 위와 마찬가지다.

 

getchar, putchar는 특정 설정없이 자동으로 표준입출력 stdout, stdin이 설정되어있음을 알 수 있고,

fgetc, fputc는 stdin, stdout으로 입출력을 프로그래머가 작성하고, 또한 파일같은 다른 형태로 변경이 가능하다.

단, 공통적으로 하나의 문자(character)를 입력받고 또는 출력한다.

 

 

반응형
반응형

오미크론이 급격하게 퍼지면서 어느덧 코로나 환자도 급격하게 늘었고, 자가격리하는 사람들이 많이 늘었다.

대부분 대기업들은 유급휴가를 제공하지만, 그렇지 못한 중소기업들이 많이 있다.

유급휴가를 받지 못한 개인은 국가에 "생활지원비"를 신청할 수 있다.

 

1인가구를 예로들면 474,600원이 지원된다. 그러나 격리기간이 14일 미만일 경우가 기준이다.

만약 5일 격리라면, 169,500 정도로 보면 된다.

반응형

신청방법
 - 
동사무소에 본인통장사본, 생활지원비 신청서 둘다 제출하면 된다.

 - 본인 관할 동이어야 하며,  시간이 나지 않는다면 대리인도 가능하다.

신청서류 (다운로드)

5-1. 격리자 생활지원비 지원.pdf
0.30MB

 

 

위 신청서를 출력하여 작성하면 된다.
본인시간이 안된다면, 대리인이 제출 가능하다.

 

반응형
반응형

c언어에서 기본적으로 프로그램을 실행할 때 항상 보는 함수가 있다.

main( )함수이다.

 

이 main함수에 윈도우나 리눅스 같은 OS의 명령프롬프트를 이용해 인자를 전달해서 특정 동작을해서 작동하도록 할 수 있다.

main함수는 프로그램 동작시 자동으로 실행되는 함수로, .exe 실행파일을 만들어놓고, OS프롬프트로 해당 .exe파일을 실행하면 된다.

 

예시)

#include <stdio.h>


// 첫번째 인자 argc는 전달된 인자의 갯수 (int형).
// 두번째는 char** 형태로 문자열 전달. (더블포인터 형 char** argv = char* argv[] 같은 말.)
int main(int argc, char* argv[])
{
	int i = 0;
	printf("전달된 인자 갯수: %d\n", argc);

	for (i=0; i<argc ;i++)
	{
		printf("%d번째 문자열: %s\n", i+1, argv[i]);
	}

	return 0;
}
반응형

(결과)

윈도우 프롬프트에 해당 프로그램의 .exe파일로 가서 실행하며 동시에 인자를 넣어준다.

드라이브가 C가 아닌 경우 아래 참고. (다른 드라이브로 이동)

https://ansan-survivor.tistory.com/83

 

윈도우 명령프롬프트 cmd에서 다른드라이브 이동 ( D드라이브 , E드라이브, F드라이브 가는 방법 )

cd 없이 >D: 입력하면 된다. 마찬가지로 나머지 드라이브도 E: F: 등등 입력하면 이동한다.

ansan-survivor.tistory.com

 

결과를 보면, 첫번째 argc 에는 입력된 인자의 갯수를 int형태로 전당하고,

argv[ ] 는 전달된 문자열(string)을 띄어쓰기를 구분자(delimeter)으로 전달함을 볼 수 있다.

각 문자열의 끝은 NULL문자로 구분하기 때문에 자동으로 NULL(\0)이 들어간다.

그러나 배열의 마지막 1개가 더 생성되서 NULL (\0)을 넣고 해당 문자열이 끝남을 알린다.

 

또한 전달 인자를 " " 큰따옴표로 묶으면 하나의 문자열로 간주하여 전달한다.

 

반응형
반응형

이 제도에 대한 설명 (아래 참고)

https://ansan-survivor.tistory.com/1265

 

2022년 청년희망적금 제도 (연 최고 이자 9.31% 의 효과) 요약

청년들을 위해 2022년도 고 금리로 예금 혜택을 제공한다. 은행제공금리는 연 5%지만 비과세를 적용하면, 마치 일반적금의 9.31% 금리 효과를 누릴 수 있다. 2년간 최대 50만원씩 적금을 하면, 만기

ansan-survivor.tistory.com

 

이 포스팅은 "국민은행" 가입방법이며, 다른은행도 이와 비슷할 것으로 예상된다.

 

기존 국민은행 계좌가 있어야 하며, 그 계좌에서 돈이 빠져나간다.

자동이체등록 가능하며 초기 적금통장에 1000원이상 넣어야 한다.

 

** 경쟁이 매우 높아서 서버접속이 잘 안된다. 계속 가입하기 눌러서 노가다 하다보면 접속된다. **

** 필자는 노가다 15분만에 되었다 **

** 로그인이 안되도 계속 로그인 시도 한다보면 로그인 된다 **

 

1. 국민은행 앱 실행 - 상풍가입 - 적금

2. 스크롤아래로 내리기 - KB청년희망적금

3. 전부동의 후 - 다음

4. 가입금액, 자동이체 날자 등등 입력 후 다음

5. 결과 확인 후 다음

반응형

6. 가입완료

 

반응형
반응형

라이트세일(Lightsail)은 아마존 클라우드에서 지원하는 가벼운 트레픽을 소화할 수 있도록 지원하는 방식이다.

라이트세일을 이용하면 워드프레스를 기본으로 자동 설치해주어 db를 만지는 일도 줄어들고 매우 편리하다!

 

이를 사용하기 위해서 AWS에 가입해야 한다.

https://ansan-survivor.tistory.com/1058

 

[AWS] 아마존 AWS 클라우드에 회원가입하고 사용하기 (무료, AWS free tier)

아마존 AWS 클라우드 리전에 한국에도 있다는 소식에 한번 구축해본다. 그러기 위해서는 AWS에 회원가입을 해야하는데 다소 까다로울 수 있어 포스팅을 한다. 영어로 되어있기에 영어가 힘든사람

ansan-survivor.tistory.com

 

 

1. 아래 Lightsail 인스턴스 생성으로 들어간다.

https://lightsail.aws.amazon.com/ls/webapp/home/instances

 

https://lightsail.aws.amazon.com/ls/webapp/home/instances

 

lightsail.aws.amazon.com

 

2. Create instance 선택

 

3. 리눅스, wordpress 선택 (이미 선택이 되어있을 것이다)

 

4. 스크롤 내려서 요금제 확인 (한달 무료, 달 $3.5불)

 

5. 해당 인스턴스의 고유 이름을 쓴다.

 

 

6. 생성됨을 확인, 처음엔 pending으로 표시되어있다.

 

7. 시간이 좀 지나면 (약 1분) 색상이 들어오면서 해당 인스턴스가 활성화 된다. 인스턴스 터미널 접속.

... 을 클릭
connect를 눌러 터미널에 접속해본다.
그런데 다른사람은 모르겠지만, 필자는 이렇게 접속이 되지 않았다.

 

8. 터미널 접속이 안될시, Putty SSH으로 접속하기.

    8-1. Putty 다운로드

https://putty.softonic.kr/download

 

PuTTY

완전하고 안정적인 텔넷 및 SSH 클라이언트

putty.softonic.kr

putty를 다운로드하고 설치한다.

 

 

        8-2. 인스턴스 접속에 필요한 키 다운받기.

Download를 누르면 .pem 확장명을 지닌 키가 다운로드 된다.

8-3. puttygen 실행

 

    8-4. 다운받은 key 로드 후 .ppk 으로 저장

        (다운받은 .pem을 로드)

    ( putty 에서 사용가능한 키로  .ppk 확장자로 저장 )

이름은 유저가 지정

    8-5. Putty로 인스턴스에 Pulic주소와 ID를 이용해 ssh 연결하기

위 Pulic 주소와 ID를 기억한다.

    복사했던 public 주소를 아랫쪽에 붙여넣는다.

 

    8-6. SSH 암호키를 삽입한다.

    해당 암호키를 가져온다.

Accept를 눌러 연결한다.

    8-7. 접속창이 뜬다. 로그인 계정을 "bitnami"로 입력

위와같이 뜨면 연결이 된 것이다.

 

9. Wordpress 관리자 게정 암호 찾기

    아래 프롬프트창에 아래와 같이 명령어를 입력한다.

cat bitnami_application_password

    그러면 아래와 같이 워드프레스 관리자 계정의 암호가 출력된다.

 

10. 워드프레스 관리자 계정 로그인하기

    - 브라우저에 http://<PublicIP주소>/wp-login.php 입력 (아래와 같이)

    - 그리고 Default 워드프레스 유저 아이디는 user 이다.

    - 아까 위에서 복사한 암호를 넣는다.

반응형

(결과)

이제 AWS Lightsail 서버로 워드프레스 웹서버가 구축 된 것이다.

필요한 테마나 플러그인을 설치하고, 도메인도 구매해서 쓰고 SSL인증도 해서 사용하면 된다.

 

 

좀 더 큰 트레픽과 용량을 요구한 웹사이트 구축은 EC2로 하면 좋다. (아래 참고)

그러나 웹서비스부터 구축해야 한다.

https://ansan-survivor.tistory.com/1076

 

[AWS Amazon Linux 2] 아마존 클라우드에 워드프레스(wordpress) 구축하여 웹호스팅

여기서 사용하는 OS는 아마존이 제공하는 Amazon Linux 2 를 이용한 것이다. 사전에 Amazon Linux 2로 만든 LAMP 웹서버가 작동하고 있어야 한다. https://ansan-survivor.tistory.com/1072 [AWS Amazon Linux] 아..

ansan-survivor.tistory.com

 

반응형
반응형

앞서 함수포인터에 관해 설명했다.

함수포인터에서 input 매개변수와 반환형 타입정보가 반드시 들어가야 된다고 설명했다.

https://ansan-survivor.tistory.com/1291

 

[C언어] 함수포인터 (함수형 포인터) 이해하기 예제

C언어의 함수에 관해서는 이전 포스팅에서 설명했다. https://ansan-survivor.tistory.com/1224 [C언어] C언어 함수 만들기, 함수 구조, 함수 템플릿, 함수 작동 순서 C언어 함수의 구조는 [return 타입] 함수명(.

ansan-survivor.tistory.com

 

그러나 함수포인터의 한종류지만, Void포인터는 타입(Type)이 존재하지 않는 Void 포인터 이다!

결론 부터 말하자면 void 포인터는 아래와 같이 선언한다.

 => void * ptr;

 

- void 포인터로 선언한 이 ptr은 그 어떠한 주소값도 다 저장이 가능하다.

- Type정보가 존재하지 않기 때문에 Type을 신경쓰지 않고 해당 주소값을 저장 가능.

- 타입 정보가 존재하지 않아서 을 사용하는 연산은 불가

 

예시)

#include <stdio.h>

/*
	모든 주소값을 저장할 수 있는 void 포인터, (type정보 필요없음, 오직 주소만 저장)
	type(자료형) 이 존재하지 않기 때문에,  *연산은 불가능하다.

	선언방법: void * ptr;
	*ptr = 3.14 ; 이러한 연산은 불가능하다. 왜냐하면, 자료형을 모르기 때문이다.
	ptr++;		  이러한 연산도 불가능하다. 자료형을 몰라서.
*/

// void이므로 return이 필요 없음.
void func(void)
{
	printf("Nothing to do\n");
}

int main()
{
	int num = 20;
	void* ptr;				// void 포인터 선언.

	ptr = &num;				// ptr포인터에 num의 주소값을 저장 (그러나 int형 type은 못따라온다)
	printf("%p \n", ptr);	// ptr이 가리키는 주소값 출력

	ptr = func;				// void 포인터에 함수포인터도 저장이 가능하다!!!!!
	printf("%p \n", &ptr);	//	ptr자체의 주소값.

	return 0;
}
반응형

프로그램을 실행시켜보면 아래와 같다.

특정 값 num의 주소가 저장이 가능하며, 함수인 func( )의 주소 또한 저장이 가능하다.

즉, 타입(type)에 구애받지 않고 어떠한 주소도 다 담을 수 있다. 다시말해 그저 해당 주소를 향해 가리키는 역할만 한다.

(결과)

void * ptr은 그 내부에 타입 상관없이 포인팅 가능.

 

반응형
반응형

C언어의 함수에 관해서는 이전 포스팅에서 설명했다.

https://ansan-survivor.tistory.com/1224

 

[C언어] C언어 함수 만들기, 함수 구조, 함수 템플릿, 함수 작동 순서

C언어 함수의 구조는 [return 타입] 함수명( [input타입 변수명] ) ex)  int  main(  int a  ) 함수명은 말 그대로 함수 이름 지정. input 은 이 함수가 실행되기 위한 입력 값을 지정하는것. return 타입은..

ansan-survivor.tistory.com

 

C언어 함수의 구조는 아래와 같다.

 

[return 타입] 함수명( [input타입 변수명] )

ex)   int   main(   int a   )

 

함수명은 말 그대로 함수 이름 지정.

input 은 이 함수가 실행되기 위한 입력 값을 지정하는것.

return 타입은 이 함수가 연산이되어 return되는 값의 타입.

 

즉 자세히 보면, 2가지의 Type이 선언되어야 한다.

1. input이 되는 값의 타입

2. return되는 인자의 타입


함수는 컴파일시 그 이름 자체로 메모리에 있는 특정 주소값으로 치환된다. 즉 함수 이름자체는 "상수형 포인터"이다.

즉, 함수의 이름 그자체는 실제로 메모리의 특정 주소값 (0x0000)를 가리키고 있는 포인터 이다.

다만 함수이름 포인터는 input인자의 type정보와, return인자의 type정보가 함께 제공되어야 한다. (void가 아니라면)

함수 선언시 메모리의 특정 주소에 포인터로 가리킨다. 이때 input, return 타입정보도 함께 입력된다.

* 함수포인터를 선언하는 방법

1. 함수의 이름은 함수가 저장된 메모리공간을 가리키는 상수형 포인터이다. (함수 이름 자체는 상수형 타입으로 변경 불가)
2. 함수이름의 의미하는 '주소값' 은 "함수 포인터 변수"를 선언해 저장가능. (함수의 주소값을 가리키는 변수 선언 가능)
3. 함수포인터변수를 선언하려면, 사용할 함수의 반환, 매개변수 Type(자료형)을 알아야 한다.

 

아래 예제에서는 2개의 함수를 선언했다.

그리고 

int (*fptr) (int, int);  <= input parameter의 이름은 중요하지 않다. type만 넣으면 된다. (2개가 입력되므로 int, int)
void (*ptrstring) (char*);

두 함수포인터를 선언해서 사용.

#include <stdio.h>

/*
	포인터를 선언하기 위해서는, 주소값과 자료형이 주어져야 하는데, 함수의 이름을 다음과 같이 생각하고 포인터를 선언한다.
	함수 읽기. (함수포인터를 선언하기 위하여)
	ex) int fct(int a );
	1.
		이 함수의 주소값은? fct의 주소. (함수이름 = 주소값)
	2.
		type형은?	"Parameter가 int 이고, return값이 int 이다."
	ex) double Fct (double a , double b );
	1.
		함수의 주소값? 함수이름 Fct 의 주소.
	2.
		type형은?	"Parameter가 2개의 double, return값이 double 이다."
        
	아래 예제에서 선언한 함수포인터변수 2개.
	int (*fptr) (int, int);
	void (*ptrstring) (char *);
*/


int fct(int a, int b)
{
	int c = 0;

	c = a - b;

	return c;
}

void ShowString(char* str)
{
	printf("%s \n", str);
}

int main()
{
	char* str = "ich liebe dich";


	// 함수포인터를 선언하기!!
	// [자료형: 매개변수 int형인, 리턴값이 int형 2개인] 포인터함수 fptr 를 선언!!
	//	함수이름은 의미없다. *만 있으면 될뿐, 그러나 자료형은 반드시 일치해야 한다.
	int(*fptr) (int, int);


	fptr = fct;		//	fptr -> fct의 주소를 가리킴. (함수이름이 주소값이므로)

	// 상수 함수 포인터로 출력
	printf("%d \n", (fct(5, 7)));

	// 변수 함수 포인터로 출력
	printf("%d \n", (fptr(10, 15)));


	// 함수 포인터 선언하기.
	// 자료형: char * (케릭터 포인터형을 매개변수로 받고, return값은 없다)
	void(*ptrstring)(char*);

	// ptrstring -> ShowString함수를 가리킴.
	ptrstring = ShowString;

	ShowString(str);
	ptrstring(str);

	return 0;
}

/*
	fct 는  '상수' 함수포인터 이름이 될 수 있다! (변경 불가)
	fptr 은 '변수' 함수포인터 이름이 될 수 있다! (변경 가능)
*/
반응형

(결과)

받는 인자 int, int 와 출력인자 int 타입인 *fptr 이름의 함수포인터를 선언.

fptr = fct 

위 과정을 아래와 같이 도식화 하면,

함수 fct는 이미 특정 메모리주소에 '상수형포인터' 으로써 저장되고,

함수포인터가 선언되고 그 함수를 인자로 받게 되면, 이제 그 함수를 가리키게 된다.

함수포인터는 '변수형포인터' 으로 동일하게 사용한다.

 

문자열도 마찬가지로 함수포인터를 선언하면 동일하게 사용 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

이전에 변수형 포인터와 상수형 포인터를 설명했다.

배열도 포인터이다. int arr[ ]; 선언이라면, arr 그 이름 자체가 int* 자료형임을 설명했다.

https://ansan-survivor.tistory.com/1249

 

[C언어] C언어 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기

포인터에 대한 간단한 설명은 아래 참고. https://ansan-survivor.tistory.com/1237 [C언어] 포인터란? 포인터에 대해 쉽게 이해하기. (포인터 변수 사용하기, 포인터로 값 변경하기, (알아두기) 컴퓨터는 32비

ansan-survivor.tistory.com

 

만약 int * arr[20]; 이라는 선언이 있다.

위 arr 의 자료형은 int** 이다.

int* 와 arr은 상수형 포인터로 만약 int arr[20]; 선언을 했다면 int* 타입이 될 것이다.

고로 앞에 int* 과 상수형 포인터 *가 합쳐져서,

int * arr[20]; 의 자료형은 int* + int* = int** 가 된다.

 

예제)

도식관계를 그려보면 아래와 같다.

#include <stdio.h>

int main()
{
	/*
		아래 ptr1 ~ ptr3 까지의 선언은 선언과 동시에 ptr은 각 num의 주소를 가리킴.
	*/
	int num1 = 10, num2 = 20, num3 = 30;
	int* ptr1 = &num1;
	int* ptr2 = &num2;
	int* ptr3 = &num3;

	// 배열의 내부 인자로 사용할 값의 자료형이 int* 이므로, 배열이름의 자료형은 int* 형이 되어야 함
	int* ptrArr[] = { ptr1, ptr2, ptr3 };
	/*				   
		ptrArr[0] -> ptr1 -> num1
		ptrArr[1] -> ptr2 -> num2
		ptrArr[2] -> ptr3 -> num3
		이런식의 포인터가 선언된 것임.
	*/

	// ptrArr은 기본적으로 *int 자료형이고, 앞에 선언한 자료형이 int* 이므로, ptrArr 자체는 int** 자료형임.
	int** dptr = ptrArr;
	// 배열에 포인터를 선언하여 같은 첫번째 주소값을 공유함. 포인터를 배열 처럼 사용할 수 있다.

	dptr[0] = 10;
	dptr[1] = 20;
	dptr[2] = 30;

	printf("%d %d %d \n", dptr[0], dptr[1], dptr[2]);

	return 0;
}
반응형

배열 내에 포인터값을 사용하기 위해서 선언을 하면, 배열 내부의 각 타입에 맞춰 배열이름의 타입형을 선언해야 함.

배열 내 사용할 인자들의 타입이 int* 이므로,  배열이름의 타입도 int* 이어야 함.

고로 -> int* arrPtr[20]; 이런식의 선언이 이루어짐.

 

배열 내 인자들은 더블포인터 상태임. arrPtr[0] 은 int* + int* 이므로 int** 자료형으로 위 예제처럼 dptr을 선언할 수 있음.

 

 

 

 

반응형
1···26272829303132···181

+ Recent posts