#정리
** 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 -c (소스파일명.c) : 오브젝트 파일(.o 확장자) 생성
- 링킹 > $gcc -o (실행파일명) (오브젝트파일명.o) : 실행파일(확장자 없음) 생성
** 오브젝트파일을 건너뛰고 실행파일을 만들 수도 있다.
- 빌드 > $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;
}