본문 바로가기

C lang

[C language] Geany편집기 - 1. 출력문, 변수 타입 / 헤더(header)설명, 컴파일(compile)방법

#정리

** C언어도 고급언어임으로 컴파일 후, 실행을 할려면 최초에 돌려줘야할 대상 즉, "main()"이 필요하다. 
 - 자바도 동일하게 컴파일 과정이 필요하나, 이클립스 같은 편집기 툴을 사용하면 자동으로 컴파일을 해준다. 
** C언어는 함수에 parameter(인자)가 없을 때, void(없음)로 표기한다.(ex. function(void) >> function() 은 가변적으로 인자를 받는 함수가 된다.)

# C header  - 헤더 (라이브러리 역할) 
//자바의 import처럼 라이브러리를 가져오는 것을 C계열에서는 헤더파일이라고 한다.
 < ex. #include <내장라이브러리.h> / #include "외부라이브러리.h"  : 라이브러리를 불러오겠다. >
 - 확장자가 .h로 되어있다.
 - <stdio.h> : printf  같은 입출력이 가능해진다. (std - standard + io - input/output)
 - <stdbool.h> : bool type의 변수 사용이 가능해진다. 
 - <string.h> : 문자열 길이를 확인하는 strlen(변수명)을 사용이 가능해진다. 



** 작성된 소스코드를 컴퓨터가 실행할 수 있게 하는 "빌드"과정은 크게 "전처리-컴파일-어셈블-링크" 4단계로 이루어져 있다.
** 큰 범주의 컴파일은 빌드 과정 중 "전처리-컴파일-어셈블"과정 전체를 포함한다. 따라서, "컴파일 + 링크" >> 빌드 정도로 크게 이해할 수 있다. 
 ** 오브젝트파일을 건너뛰고 실행파일을 만들 수도 있다.

# C build(compile - 컴파일) 
//컴파일은 소스코드가 변경될 때마다 다시 해줘야한다.
 - C언어는 gcc 컴파일러(GNU C Compiler)로도 컴파일 가능하다.
 * 객체파일이라고 번역되고 객체와 비슷하지만  기능을 하나 실제로 객체로 보긴 어렵다. 추후에 오브젝트파일에서 클래스가 파생되므로, 객체(클래스) 파일의 조상 정도라고 볼 수 있다.
//컴파일 방법 : 오브젝트 파일 생성(컴파일) >> 실행파일 변경(링킹)
 *오브젝트 파일과 실행파일 이름은 자유롭게 정할 수 있지만, 대체로 소스코드파일과 동일하게 한다.
  - 컴파일 > $gcc -c (소스파일명.c) : 오브젝트 파일(.o 확장자)  생성
  - 링킹 > $gcc -o (실행파일명) (오브젝트파일명.o) :  실행파일(확장자 없음) 생성 
  - 빌드 > $gcc -o (실행파일명) (원본파일명.c) :  실행파일(확장자 없음) 생성 



** 포인터 변수 : 변수의 값이 들어있는 메모리 공간주소를 가리키는 변수이다.
  - 포인터 변수에 포인터를 달면(**변수명) 해당 메모리 주소에 저장된 값을 가져올 수 있다. (싱글톤 패턴) 

# Geany 편집기 
//Geany 편집기 사용 단축키
 - 저장 Ctrl +s
 - 확대 축소 쉬프트 + 마우스 휠
 - 줄복사 컨트롤 + D
//소스코드 작성 후, 실행을 위해서는 아이콘을 순서대로 눌러주면 된다.
 - (F8) Compile: 컴파일 
 - (F9) Build : 실행파일 생성 (컴파일 건너뛰고 바로 실행파일 생성해도됨)
 - Run: 실행


** 같은 이름으로 다른 타입의 변수를 중복 정의하면 위의 오류가 나온다. (ex. long ln1 = 123; 정의를 한 상태에서 다른 타입의 int ln1 = 123; 로 변수를 재정의 하는 경우)

# 출력문 - printf 
// printf 명령문 - 대표적인 타입 출력 명령 (타입 예제에서 다른 타입도 같이 보기)
 - %s,"kim");  //문자열 "kim"출력해줘
 - %5s,"kim");//5칸 띄우고 문자열 "kim"출력해줘
 - %c\n",'A'); //문자 'A' 출력해줘
 - %d\n",100); //정수 100 출력해줘
 - %f\n",3.141592); //실수 3.141592 출력해줘
 - %.2f\n",3.141592); //실수 소수점 2째자리까지 3.141592 출력해줘


** unsigned (부호가 없는): 양수 표현으로 동일 크기에서 양수만으로 범주를 가지므로, 음수를 넣어도 양수가 반환된다. (ex. char : -128~127 : 256 >> unsigned char : 0 ~ 256 )

# variable type - 변수 타입 (printf 표기법) 
//자바처럼 변수에 타입을 정해줘야한다.
 - 자바가 C를 기반으로 개선된 내용이어서 겹치는게 많다.
//자바와 달리 타입을 내가 자유롭게 만들어 쓸 수 있다.
 - 타입 선언 구문이 있다.
// no type : void
//정수형 - 문자 
 - char c = 'a';//1byte //-128~127 : 256 // %c (자바는 2byte, C언어는 1byte)
 - char c = -128;//1byte // 숫자를 넣을 수도 있다.(숫자로 표기시 %d 사용) 
 - unsigned char c2 = 'b'; //0~255 // %u // b >> 98로 바뀐다.
//정수형 int / short / long / long long  
 -int su = 2147483647; //2~4byte // -2147483648 ~ 2147483647 // %d  (리눅스 int는 대부분 4byte) 
 - unsigned int su2 =-200;//unsigned : 양수 표현 // 0 ~ 4294967096 // %u 
 - short s1 = -32768; // 2byte // -32768~32767 : 65535 // %d - unsigned short s2 = -32768; // 2byte // 0~65535 // %u  
 - long lng1 = 2147483647; // 4byte // -2147483648 ~ 2147483647 // %ld // 긴 정수라서 ld로 작성한다. 
 - unsigned long lng2 = -2147483648; // 4byte // 0 ~ 4,294,967,295 // %lu 
 - long long llng1 = 92147483647; // 8byte //-92147483648 ~ 92147483647 // %lld 
 - unsigned long long llng2 = -92147483648; // 8byte // 0 ~ 184,294,967,295 // %llu
//실수형 float / double  
 - float f = 3.141592f; //값에 f를 넣어준다. // %f
 - double d = 3.141592; //f안적는다. // %lf
// Boolean - #include <stdboo.h> bool type변수를 사용하기위해 선언이 필요하다. 
 - bool b = true; //1 // %d - b = false; //0 // %d



  **C에서는 자바처럼 string 타입이 없다.
  **strcat : (string) concatenate - (문자열을) 사슬같이 잇다.
  **strtok : (string) tokenize - (문자열을) 단위로 자르다.
  **포인터 변수는 초기화한 뒤 상수적인 성격을 가집니다. 따라서 배열로 초기화된 문자열이 내용물을(배열 원소)를 변경할 수 있는 것과 달리 포인터는 배열의 원소를 바꿀 수 없습니다.

# 문자열 변수 다루기 
// C에서는 char(문자)의 배열의 형태로 만들어 마치 문자열처럼 사용한다.
 - 포인터(*)를 사용한 포인터 변수를 이용해, 문자열 표현에 활용한다.
<문자열을 표현하는 방법 4가지 - 숨겨진 예문 코드 참조>
//1.배열없이 하나씩 문자를 나열하여 표현한다.
//2.{}를 이용하여 char의 배열로 string을 표현한다. - 메모리 공간 확보를 충분하지 않으면 이상한 값이 나올 수 있으므로, 충분한 메모리 공간 확보를 위해 "문자열 갯수 +1" 개 이상의 배열 방을 만든다.
//3.배열 방의 수 정의 및 { } 없이 " "로 다 묶어서 표현한다.
 - char cs2[] = "AB"; / printf("cs2:%s\n",cs2); 
//4. pointer를 사용하여 표현한다. - char *cs3 = "ABCEFGCDCC"; / printf("*cs3:%s\n",cs3);

//문자열 관련 함수 1(길이 확인, 문자열 비교, 문자 추출, 병합(값 잇기), 글차 추출)
< 함수 모두 #include <string.h> 선언 필요 >
- strcpy(대상변수,넣을 문자열) //copy - 복사붙여넣기(값 변경)
- strcat(대상변수, 붙일 값); //concatenate - 문자열 병합
 *cs1 = cs1 + "CD"; //자바방식 에러발생 
 *strcat(cs3,"CD");//포인터 변수에 적용 error 
 *strcat(cs1,"CD");//배열 크기가 정해지지 않고 선언된 뒤, 추가하면 이후 다른 코딩에 error발생 위험있음.
- strlen(대상변수) //length - 문자열 길이 반환 (정수 반환)
- strcmp(변수1,변수2) //compare : 문자열 비교 - 참/거짓 형태로 반환 (0, -1)
- strchr(대상변수,'구분문자') //char search : 처음 나온 지정 '문자'와 다음 문자열 출력
- strstr(대상변수,"구분문자열") //string search : 처음 나온 지정 "문자열"과 다음 문자열 출력
 *문자열의 시작 주소로 반환되며, 배열도 마찬가지로 문자열의 시작 주소를 알기 때문에 출력이 나오는 것이다.
 *while문으로 특정 문자열이 포함 된 갯수를 파악할 수 있다.(다음 문자열("D")의 주소(ptr+1)을 불러줘야한다.)
- strtok(대상변수, 구분자); // 구분자 기준으로 문자 순서대로 추출
 * 포인터 변수에 적용 error
 * while 문과 세트로 많이 사용되며, 구분자를 뽑으면 다음 구분자를 찾아주는 함수이다.
 * strtok 함수를 처음 호출할때는 문자열을 넣어주지만 동일한 문자열에 한하여, 잘린 나머지 문자열을 가지고 올 때는 따로 문자열을 넣지 않고, strtok 함수를 계속 호출하여 문자열을 추출할 수 있습니다. (문자열이 없으면 NULL값 반환되면서 추출 종료)

 

 

** C언어도 고급언어임으로 컴파일 후, 실행을 할려면 최초에 돌려줘야할 대상 즉, "main()"이 필요하다. 

 - 자바도 동일하게 컴파일 과정이 필요하나, 이클립스 같은 편집기 툴을 사용하면 자동으로 컴파일을 해준다. 

** C언어는 함수에 parameter(인자)가 없을 때, void(없음)로 표기한다.(ex. function(void) >> function() 은 가변적으로 인자를 받는 함수가 된다.)

** C에서 주석은 자바처럼 //로 쓴다.

 

# C header  - 헤더 (라이브러리 역할) 

//자바의 import처럼 라이브러리를 가져오는 것을 C계열에서는 헤더파일이라고 한다.

 < ex. #include <내장라이브러리.h> / #include "외부라이브러리.h"  : 라이브러리를 불러오겠다. >

  - 확장자가 .h로 되어있다.

  - <stdio.h> : printf  같은 입출력이 가능해진다. (std - standard + io - input/output)

  - <stdbool.h> : bool type의 변수 사용이 가능해진다. 

  - <string.h> : 문자열 길이를 확인하는 strlen(변수명)을 사용이 가능해진다. 

 


 

** 작성된 소스코드를 컴퓨터가 실행할 수 있게 하는 "빌드"과정은 크게 "전처리-컴파일-어셈블-링크" 4단계로 이루어져 있다.

** 큰 범주의 컴파일은 빌드 과정 중 "전처리-컴파일-어셈블"과정 전체를 포함한다. 따라서, "컴파일 + 링크" >> 빌드 정도로 크게 이해할 수 있다. 

 

# C build(compile - 컴파일) 

//컴파일은 소스코드가 변경될 때마다 다시 해줘야한다.

 - C언어는 gcc 컴파일러(GNU C Compiler)로도 컴파일 가능하다.

gcc 컴파일러 정보 확인

* 객체파일이라고 번역되고 객체와 비슷하지만  기능을 하나 실제로 객체로 보긴 어렵다. 추후에 오브젝트파일에서 클래스가 파생되므로, 객체(클래스) 파일의 조상 정도라고 볼 수 있다.

//컴파일 방법 : 오브젝트 파일 생성(컴파일) >> 실행파일 변경(링킹)

 *오브젝트 파일과 실행파일 이름은 자유롭게 정할 수 있지만, 대체로 소스코드파일과 동일하게 한다.

  - 컴파일 > $gcc -c (소스파일명.c) : 오브젝트 파일(.o 확장자)  생성

  - 링킹 > $gcc -o (실행파일명) (오브젝트파일명.o) :  실행파일(확장자 없음) 생성 

실행파일(확장자 없음)로 변경하면 권한x가 생긴 것을 볼 수 있다.&amp;nbsp;

 ** 오브젝트파일을 건너뛰고 실행파일을 만들 수도 있다.

  - 빌드 > $gcc -o (실행파일명) (원본파일명.c) :  실행파일(확장자 없음) 생성 

>> 파일 실행

 

 


** 포인터 변수 : 변수의 값이 들어있는 메모리 공간주소를 가리키는 변수이다.

  - 포인터 변수에 포인터를 달면(**변수명) 해당 메모리 주소에 저장된 값을 가져올 수 있다. (싱글톤 패턴) 

 

# Geany 편집기 

//Geany 편집기 사용 단축키

 - 저장 Ctrl +s

 - 확대 축소 쉬프트 + 마우스 휠

 - 줄복사 컨트롤 + D

 

//소스코드 작성 후, 실행을 위해서는 아이콘을 순서대로 눌러주면 된다.

 - (F8) Compile: 컴파일 

 - (F9) Build : 실행파일 생성 (컴파일 건너뛰고 바로 실행파일 생성해도됨)

 - Run: 실행

 

//main.c 탬플릿에 양식은 다음과 같다.

 - 앞에 별( * )이 붙는 것은 포인터이다.

 - 포인터가 붙은 변수를 포인터 변수라고 하며, 변수 값의 메모리 주소를 담고 있다.

#include <stdio.h>

int main(int argc, char **argv)
{

	return 0;
}

 

# 출력문 - printf 

// printf 명령문 - 대표적인 타입 출력 명령 (타입 예제에서 다른 타입도 같이 보기)

- %s,"kim");  //문자열 "kim"출력해줘
- %5s,"kim"); //5칸 띄우고 문자열 "kim"출력해줘
- %c\n",'A'); //문자 'A' 출력해줘
- %d\n",100); //정수 100 출력해줘
- %f\n",3.141592); //실수 3.141592 출력해줘
- %.2f\n",3.141592); //실수 소수점 2째자리까지 3.141592 출력해줘

 

--예문 코드 보기--

더보기
#include <stdio.h>

int main(int argc, char **argv)
{
	printf("Hello C...\n");
	printf("Hello C...%s\n","kim"); //문자열 "kim"출력해줘
	printf("Hello C...%5s\n","kim"); //5칸 띄우고 문자열 "kim"출력해줘
	printf("Hello C...%c\n",'A'); //문자 'A' 출력해줘
	printf("Hello C...%d\n",100); //정수 100 출력해줘
	printf("Hello C...%f\n",3.141592); //실수 3.141592 출력해줘
	printf("Hello C...%.2f\n",3.141592); //실수 소수점 2째자리까지 3.141592 출력해줘
	
	return 0;
}

 


** 같은 이름으로 다른 타입의 변수를 중복 정의하면 위의 오류가 나온다. (ex. long ln1 = 123; 정의를 한 상태에서 다른 타입의 int ln1 = 123; 로 변수를 재정의 하는 경우)

 

 

# variable type - 변수 타입 (printf 표기법) 

//자바처럼 변수에 타입을 정해줘야한다.

 - 자바가 C를 기반으로 개선된 내용이어서 겹치는게 많다.

//자바와 달리 타입을 내가 자유롭게 만들어 쓸 수 있다.

 - 타입 선언 구문이 있다.

 

** unsigned (부호가 없는): 양수 표현으로 동일 크기에서 양수만으로 범주를 가지므로, 음수를 넣어도 양수가 반환된다.

 (ex. char : -128~127 : 256 >> unsigned char : 0 ~ 256 )

 

 

// no type : void
//정수형 - 문자
 - char c = 'a';//1byte //-128~127 : 256 // %c (자바는 2byte, C언어는 1byte)

 - char c = -128;//1byte // 숫자를 넣을 수도 있다.(숫자로 표기시 %d 사용)
 - unsigned char c2 = 'b'; //0~255 // %u // b >> 98로 바뀐다.


//정수형 int / short / long / long long 
 - int su = 2147483647; //2~4byte // -2147483648 ~ 2147483647 // %d  (리눅스 int는 대부분 4byte)
 - unsigned int su2 =-200;//unsigned : 양수 표현 // 0 ~ 4294967096 // %u
 - short s1 = -32768; // 2byte // -32768~32767 : 65535 // %d
 - unsigned short s2 = -32768; // 2byte // 0~65535 // %u 
 - long lng1 = 2147483647; // 4byte // -2147483648 ~ 2147483647 // %ld // 긴 정수라서 ld로 작성한다.
 - unsigned long lng2 = -2147483648; // 4byte // 0 ~ 4,294,967,295 // %lu
 - long long llng1 = 92147483647; // 8byte //-92147483648 ~ 92147483647 // %lld
 - unsigned long long llng2 = -92147483648; // 8byte // 0 ~ 184,294,967,295 // %llu

//실수형 float / double 
 - float f = 3.141592f; //값에 f를 넣어준다. // %f
 - double d = 3.141592; //f안적는다. // %lf

// Boolean
 - #include <stdboo.h> bool type변수를 사용하기위해 선언이 필요하다.
 - bool b = true; //1 // %d
 - b = false; //0 // %d

 

-- 예문 코드 보기 --

더보기
#include <stdbool.h> 
#include <stdio.h>

int main(int argc, char **argv)
{
	printf("type..\n");
	//C언어도 변수에 타입이 필요하다.
	// no type >> void

	//정수형 - 문자
	printf("------------char-----------\n");
	char c = 'a';//1byte //-128~127 : 256 // %c (자바는 2byte, C언어는 1byte)
	printf("char: %c\n",c);
	c = -128;//1byte // 숫자를 넣을 수도 있다.(숫자로 표기시 %d 사용)
	printf("char: %d\n",c);
	
	unsigned char c2 = 'b'; //0~255 // %u // b >> 98로 바뀐다.
	printf("unsigned char:%u\n",c2);
	
	//정수형 
	printf("------------integer number-----------\n");
	int su = 2147483647; //2~4byte // -2147483648 ~ 2147483647 // %d  (리눅스 int는 대부분 4byte)
	su = -100;
	printf("int:%d\n",su);
	unsigned int su2 =-200;//unsigned : 양수 표현 // 0 ~ 4294967096 // %u
	printf("unsigned int:%u\n",su2);

	short s1 = -32768; // 2byte // -32768~32767 : 65535 // %d
	printf("short:%d\n",s1);
	unsigned short s2 = -32768; // 2byte // 0~65535 // %u 
	printf("unsigned short:%u\n",s2);
	
	long lng1 = 2147483647; // 4byte // -2147483648 ~ 2147483647 //%ld
	printf("long: %ld\n",lng1);
	unsigned long lng2 = -2147483648; // 4byte // 0 ~ 4,294,967,295 // %lu (긴 정수라서 ld로 작성한다.)
	printf("unsigned long: %lu\n",lng2);
	
	long long llng1 = 92147483647; // 8byte //-92147483648 ~ 92147483647 // %lld
	printf("long: %lld\n",llng1);
	unsigned long long llng2 = -92147483648; // 8byte // 0 ~ 184,294,967,295 // %llu
	printf("unsigned long long: %llu\n",llng2);
	
	//실수형
	printf("------------real number-----------\n");
	float f = 3.141592f; //값에 f를 넣어준다. // %f
	printf("float: %f\n",f); 

	double d = 3.141592; //f안적는다. // %lf
	printf("float: %lf\n",d); // % lf(long float) 작성한다.
	
	printf("------------boolean-----------\n");
	//#include <stdboo.h> bool type변수를 사용하기위해 선언이 필요하다.
	bool b = true; //1 // %d
	printf("bool: %d\n",b); 
	b = false; //0 // %d
	printf("bool: %d\n",b); 
	
	return 0;
}

 


**포인터 변수는 초기화한 뒤 상수적인 성격을 가집니다. 따라서 배열로 초기화된 문자열이 내용물을(배열 원소)를 변경할 수 있는 것과 달리 포인터는 배열의 원소를 바꿀 수 없습니다.

 

# 문자열 변수 다루기 

// C에서는 char(문자)의 배열의 형태로 만들어 마치 문자열처럼 사용한다.

 * C에서는 자바처럼 string 타입이 없다.

 - 포인터(*)를 사용한 포인터 변수를 이용해, 문자열 표현에 활용한다.

<문자열을 표현하는 방법 4가지 - 숨겨진 예문 코드 참조>

//1.배열없이 하나씩 문자를 나열하여 표현한다.
//2.{}를 이용하여 char의 배열로 string을 표현한다.
 - 메모리 공간 확보를 충분하지 않으면 이상한 값이 나올 수 있으므로, 충분한 메모리 공간 확보를 위해 "문자열 갯수 +1" 개 이상의 배열 방을 만든다.

//3.배열 방의 수 정의 및 { } 없이 " "로 다 묶어서 표현한다.

 - char cs2[] = "AB"; / printf("cs2:%s\n",cs2); 
//4. pointer를 사용하여 표현한다.
 - char *cs3 = "ABCEFGCDCC"; / printf("*cs3:%s\n",cs3);

//문자열 관련 함수 1(길이 확인, 문자열 비교, 문자 추출, 병합(값 잇기), 글차 추출)

< 함수 모두 #include <string.h> 선언 필요 >

- strcpy(대상변수,넣을 문자열) //copy - 복사붙여넣기(값 변경)

- strcat(대상변수, 붙일 값); //concatenate - 문자열 병합

  *cs1 = cs1 + "CD"; //자바방식 에러발생
  *strcat(cs3,"CD");//포인터 변수에 적용 error
  *strcat(cs1,"CD");//배열 크기가 정해지지 않고 선언된 뒤, 추가하면 이후 다른 코딩에 error발생 위험있음.

- strlen(대상변수) //length - 문자열 길이 반환 (정수 반환)

- strcmp(변수1,변수2) //compare : 문자열 비교 - 참/거짓 형태로 반환 (0, -1)

- strchr(대상변수,'구분문자') //char search : 처음 나온 지정 '문자'와 다음 문자열 출력

- strstr(대상변수,"구분문자열") //string search : 처음 나온 지정 "문자열"과 다음 문자열 출력

 *문자열의 시작 주소로 반환되며, 배열도 마찬가지로 문자열의 시작 주소를 알기 때문에 출력이 나오는 것이다.

 *while문으로 특정 문자열이 포함 된 갯수를 파악할 수 있다.(다음 문자열("D")의 주소(ptr+1)을 불러줘야한다.)

- strtok(대상변수, 구분자); // 구분자 기준으로 문자 순서대로 추출

 * 포인터 변수에 적용 error

 * while 문과 세트로 많이 사용되며, 구분자를 뽑으면 다음 구분자를 찾아주는 함수이다.

 * strtok 함수를 처음 호출할때는 문자열을 넣어주지만 동일한 문자열에 한하여, 잘린 나머지 문자열을 가지고 올 때는 따로 문자열을 넣지 않고, strtok 함수를 계속 호출하여 문자열을 추출할 수 있습니다. (문자열이 없으면 NULL값 반환되면서 추출 종료)

 

--예문 코드보기--

더보기
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
	
	char cs1[] = "ab cd ef"; 
	char cs2[10] = "AB "; 
	char *cs3 = "ABCDE FG ABCDE FG";
	
	printf("cs1:[%s], cs2:[%s], cs3:[%s]\n",cs1, cs2, cs3);
	
	//copy - 복사붙여넣기(값 변경)
	printf("cs1 copy:%s\n",strcpy(cs1,"AB CD EF"));
	//printf("cs2 copy:%s\n",strcpy(cs2,cs1));//cs1 value >> cs2
	
	//concatenate - 문자열 병합
	//cs1 = cs1 + "CD"; //자바방식 에러발생
	//strcat(cs3,"CD");//포인터 변수에 적용 error
	//strcat(cs1,"CD");//배열 크기가 정해지지 않고 선언된 뒤, 추가하면 이후 다른 코딩에 error발생 위험있음.
	printf("cs1 concat:%s\n",strcat(cs2,"CD EF"));// >> AB CD EF
	
	//length - 문자열 길이 반환 (%d)
	printf("cs1 length:%d\n",strlen(cs1));
	printf("cs2 length:%d\n",strlen(cs2));
	printf("cs3 length:%d\n",strlen(cs3));
	
	//compare - 참/거짓 반환 (0, -1)
	printf("cs1,cs2 compare:%d\n",strcmp(cs1,cs2)); 
	printf("cs2,cs3 compare:%d\n",strcmp(cs2,cs3)); 
	
	//char search : 처음 나온 지정 '문자'와 다음 문자열 출력
	printf("char search cs2:%s\n",strchr(cs2,'C'));// >> CDE
	printf("char search cs3:%s\n",strchr(cs3,'C'));// >> CDE FG
	
	
	//string search : 처음 나온 지정 '문자열'과 다음 문자열 출력
	printf("str search cs2:%s\n",strstr(cs3,"C"));//배열과 마찬가지로 문자열의 시작 주소를 알기 때문에 출력이 나오는 것이다.
	printf("str search cs3:%s\n",strstr(cs3,"BC"));
	
	//특정 문자열이 포함 된 갯수를 파악할 수 있다.
	printf("strstr while..\n");
	char *ptr = strstr(cs3,"CD"); //return type is char *
	int count = 0;
	while(ptr != NULL){
		count++;
		printf("%s\n",ptr);
		//ptr = strtok(NULL,"CD");//찾을 문자열이 없을 때(NULL)까지, 자른 문자 다음부터 구분자 찾기 
		ptr = strstr(ptr+1,"CD");//strtok와 달리 다음으로 넘겨주는 기능이 없어, 그 다음 문자열("D")의 주소(ptr+1)을 불러줘야한다.
	}
	printf("count:%d\n",count);
	
	
	//tokenize : 값 쪼개어 추출 (지정된 값 앞쪽 문자열 추출) 
	//char *ptr2 = strtok(cs3," ");//포인터 변수에 적용 error
	char *ptr2 = strtok(cs2," ");//띄어쓰기 앞쪽 추출
	printf("cs2..%s\n",cs2);
	
	//문자열이 끝날 때까지 반복 추출
	while(ptr2 != NULL){
		printf("%s\n",ptr2);
		ptr2 = strtok(NULL," ");//찾을 문자열이 없을 때(NULL)까지, 자른 문자 다음부터 구분자 찾기 
	}
	
	
	return 0;
}