반응형

【 C 언어 】 #60 문자열을 구분하기 [strtok()함수사용]

 

 strtok() 함수는 이전에 검색한 위치를 저장할 수 있기 때문에 공백을 인지해서 문장을 구분 짓는 코드를 작성해보자.



▶ 문제1  : 영어 문장(문자열)을 입력받고 공백으로 구분하여 화면에 출력하라. 


▶ 실행 결과 :

(이미지 클릭, 확대해서 보세요)



▶ 포인트 


- strtok() 함수 원형 :  char* strtok(char* strToken, const char* strDelimit)


- 함수 사용을 위해 strtok() 함수가 포함 되어 있는 <string.h > 헤더파일을 선언하라.


▶ 프로그램 (답안 예시) : 

(이미지 클릭, 확대해서 보세요)


▶ 프로그램 설명 : 

- strtok() 함수는 내부적으로 이전에 검색한 위치를 저장하고 있다. 따라서 string이 아닌 NULL을 strtok()함수에 넘겨 주면, 검색된 다음 위치부터 자동으로 검색하게 된다.

token = strtok(string,TOKEN);  TOKEN을 " "(공백) 으로 define(정의) 했으므로 공백이 있는지 찾는다. 만약 공백을 찾은 경우, 공백이 있는 자리에 NULL값을 넣은 후 문자열의 선두 번지를 반환 한다.  만약 공백이 없는 경우, 문자 배열 변수 string의 선두 번지를 반환한다.


while(token != NULL)  반환값이 NULL인지 비교한다. NULL이 아니면 token 값을 출력(pus)하고 NULL 이면 while문을 종료 한다.


token = strtok(NULL, TOKEN);  앞의 코딩 문 token = strtok(string,TOKEN)에서 공백을 찾은, 다음 번지부터 다시 공백을 찾는데, 공백이 있을 경우 NULL값을 넣은 후 다음 문자열의 선두 번지를 반환한다. 

- strtok() 함수는 이전에 검색한 위치를 저장하고 있기 때문에 string이 아닌 NULL 값을 strtok()함수에 넘겨주면, 검색된 다음 위치부터 자동으로 검색하게 된다. 


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


▶ 소스코드 다운로드 :  


60 문자열을 구분하기 strtok() 함수 사용하기.cpp



반응형
반응형

【 C 언어 】 #59 문자열 중에서 특정문자만 검색하기 ( strchr 함수 사용하기)

 

 strchr() 함수를 사용하면 입력받은 문자열 중에 특정 문자 하나가 있는지 검색할 수 있다. 



▶ 문제1  : 영어 문장(문자열)을 입력받고 문자열 중에서 'u' 라는 문자가 있는지 검색하여 있으면 찾았다는 문장을 출력하고, 없으면 없다는 메세지를 출력하라. 'u' 문자의 위치값도 표시하라


▶ 실행 결과 :

(이미지 클릭, 확대해서 보세요)



▶ 포인트 


- strchr() 함수 원형 :  char* strchr(const char* string, int c);


- 함수 사용을 위해 strstr() 함수가 포함 되어 있는 <string.h > 헤더파일을 선언하라.


▶ 프로그램 (답안 예시) : 

(이미지 클릭, 확대해서 보세요)


▶ 프로그램 설명 : 

- strstr() 함수는 문자열 뿐 아니라 단일 문자도 검색이 가능하다

- char *ret   :  strchr()함수가 반환하는 문자형 포인터 값을 저장할 변수를 정의한다. 

- 문자열을 배열 변수 string[100]에 입력받는다. 

- #define FIND_CHR 'u'   :   u 를 대체하여 FIND_CHR로 선언한다

- ret = strchr(string, FIND_CHR   :  입력받은 문자열 중에 'u' 가 있는지 검색하여 찾으면 그 위치의 메로리(번지) 값을 반환(저장) 한다.  없으면 NULL포인터를 반환


- printf("%d 위치에서...., ret-string+1)     :  문자열 중에서 'u'값이 검색된 경우, 그 위치의 메모리 값(번지)에서 문자열 배열 변수 string의 메모리 값(번지)를 빼면 'u'문자의 위치 값을 얻을 수 있다. 단, ...0 번지의 경우 계산이 되지 않기에 정확한 순서값을 얻기 위해 +1을 더해 준다.


- 프로그램에서 처럼 변수 'ret' 와 'string'의 메모리 값(번지)을 출력 해보면 좀더 명확히 이해 될 것이다.   


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


▶ 소스코드 다운로드 :  


59 문자열 검색하기 strchr() 함수 사용하기.exe



반응형
반응형

【 C 언어 】 #43 데이터형에 따른 메모리 할당 크기 확인하기


 데이터 유형에 따라 메모리를 할당 받는 크기가 다르다. 예를 들어 정수형인 int는 4byte(1byte 는 8bit), char형은 1byte... 요즘 처럼 아두이노 등을 활용할 일이 많은 상황에서 작성 프로그램이 커질 경우, 데이터 유형에 따른 메모리 할당 크기를 파악하고 있으면, 변수 선언시, 비효과적으로 메모리를 찾이하는 것을 방지 할 수 있다. 


▶ 문제  :  데이터 유형에 따른, 다음 각 변수들을 선언하고 각각의 메모리 사이즈를 화면에 출력하라.  (출력할 유형 : int, char, short, long, float, double)


▶ 실행 결과 :


(이미지 클릭, 확대해서 보세요)



▶ 포인트 


- 데이터 유형에 따라 변수명을 선언한다. 

- 변수 유형에 따른 메모리 크기를 확인 할 수 있는 함수는 sizeof()  이다. (byte 단위)

- 위 6가지 외에도, 부호를 나타낼 수 있고 없고에 따른 unsigned 가 붙는 유형 등이 있다. 




▶ 프로그램 (답안 예시) : 

(이미지 클릭, 확대해서 보세요)


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 소스코드 다운로드 :  


43 데이터형의 메모리 할당크기 확인하기.cpp



반응형

【 C 언어 】 #42 공용체 (union) 이해하기

Language/C & C++ 2018. 5. 8. 15:59 Posted by 엑소더스팩토리
반응형

【 C 언어 】 #42 공용체 (union) 이해하기



 공용체는 구조체와 선언 및 사용 방법이 매우 유사 하다.  구조체 처럼 서로 다른 데이터 유형을 하나로 묶어 사용할 수 있는 장점이 있으며, 구조체와의 차이점은 정의 된 변수들의 메모리 할당 방식에 차이가 있다. ( 변수가 할당 될 때 하나의 메모리 공간에 여러 변수들의 메모리가 공용으로 할당 되어 사용된다 )


▶ 문제  : int i, int j 를 공용체로 묶어 선언하고  i = 3을 대입 후 printf 문으로 i의 값을 출력하고 ,  j = 5  를 대입 후 printf 문으로 j의 값을 출력하고 난 후 ,  다시 i의 값을 출력해 보라. 

 (여러 타입의 변수를 공용체로 묶어 사용할 수 있으나 여기서는 int 타입만 사용하였다.  공용체 변수명 등은 임의로 정하라)


▶ 실행 결과 :


(이미지 클릭, 확대해서 보세요)



▶ 포인트 


- 공용체 또한 구조체와 마찬가지로 실제로 변수를 선언 하는 것은 아니며, 선언하는 변수 들의 틀(템플릿)을 만들어 주는 것에 불과 하다는 점을 기억하라.


- 공용체와 구조체의 차이점 :

 구조체의 경우 선언 하는 변수 만큼 메모리를 할당한다.  

 예) int i , char j , double k  라고 구조체로 묶어 선언 할 경우 

모두  4 byte (int) + 1 byte (char) + 8 byte (double) = 13 byte 의 메모리를 할 당하게 된다.   즉, 메모리 공간을 변수마다 각각 할당하여 사용함


 그러나 공용체는 함께 선언된 변수들을 하나의 메모리에 할당하게 된다. 

단, 이때 함게 선언된 변수들중 사이즈가 가장 큰 것을 기준으로 할당 하게 된다


 예) int i , char j , double k  라고 공용체로 묶어 선언 할 경우 

모두  4 byte (int) , 1 byte (char) , 8 byte (double) , 중 용량이 가장 큰 8 byte 를 기준으로 메모리를 할 당하게 된다.  따라서 위 프로그램의 실행결과를 보면 i = 3 이 입력 되었음에도 불구하고 j=5 가 입력 된 후에는 , (동일 번지의) 메모리를 공유하고 있던 i에도 5가 입력 되어 버린 것이다. 

즉, 메모리 공간을 공용체로 선언된 모든 변수들이 같이 사용함.


- 공용체는 과거 마이크로 보드 처럼 메모리 용량이 작아 프로그램의 제약이 많았던 상황에서 주로 사용되었으며, 메모리를 순차적으로 사용하면 되는 프로그램에서 주로 사용된 기법이었다.  




▶ 프로그램 (답안 예시) : 

(이미지 클릭, 확대해서 보세요)


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 소스코드 다운로드 :  


42 공용체 (union) 이해하기.cpp




반응형
반응형

【 C 언어 】 #41 사용자 정의 데이터형( typedef ) 이해하기



 C++ 에서 사용되는 데이터형 등을 C언어에서도 사용 할 수 있도록 사용자가 정의하여 쓸 수 있는 데이터형을 말한다.  다르게 얘기하면 내장함수로 존재하지 않은 변수명을 프로그램 내에서 내장함수 인것 처럼 사용이 가능하다. 
즉, 사용자가 임의로 데이터형을 정의해서 사용할 수 있다.


▶ 문제  : C++의 내장 함수인 bool 형을 C 코딩툴에서도 사용 할 수 있도록 사용자 정의 데이터 형을(typedef) 이용하여 정의하고, 숫자 '1'을 입력을 받으면, 
'true'를 출력하고 숫자 '0'을 입력 받으면 'false'를 출력하고, 그 외 숫자를 입력 받으면 " 
1과 0 중에 하나를 입력하세요 " 라는 메세지를 출력 하는 프로그램을 작성하라.  

( 단, 본인은 C++ 이 지원 되는 코딩 툴에서 작성하기 때문에, 'bool' 은 이미 정의 되어 있다. 따라서 정의 되어 있지 않은 'bools'라는 변수명을 사용 하였다)


▶ 실행 결과 :


(이미지 클릭, 확대해서 보세요)




▶ 포인트 


- typedef 사용 형식 

- 위와 같이 선언 하고 나면, 'Condition' 이라는 변수를 int 형으로 다음과 같이 선언이 가능 하다.  " bools Condition "



▶ 프로그램 (답안 예시) : 


(이미지 클릭, 확대해서 보세요)



+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




▶ 소스코드 다운로드 :  


41 사용자 데이터형(typedef) 이해하기.cpp





~~~~~~~~~~~~~~~~~~ 추가 설명 ~~~~~~~~~~~~~~~~~~~~~~~~~


'typedef' 문은 구조체 나 공용체, 열거형 등에서도 사용 할 수 있다. 


1). 구조체 사용 예시


typedef struct

{

int kor;

int eng;

int math;

} Average;


Average  AV;     // 원래는 'struct Average AV;' 라고 선언해야하나, 
AV.kor = 80;      // 이처럼 줄여서 사용할 수 있게 된다.



2). 공용체 사용 예시


typedef union

{

char ch;

int Count;

} Pluse;


Pluse  PP;             // 원래는 'union Pluse PP;' 라고 선언해야하나, 
PP.Count =  10;     // 이처럼 줄여서 사용할 수 있게 된다.




반응형

【 C 언어 】 #40 열거형(enum) 이해하기

Language/C & C++ 2018. 5. 4. 10:01 Posted by 엑소더스팩토리
반응형

【 C 언어 】 #40 열거형(enum) 이해하기



 열거형은 일정한 순서를 가진 상수를 만드는데 사용되며, 순차적으로 나열, 열거 한드는 뜻으로 열거형이라 한다. 


▶ 문제  : 열거형 선언 함수인 'enum'을 사용하여, 월, 화, ... , 일요일 , 순서로하여, 특정 요일에 임의 숫자를 지정 후  해당 숫자를 출력하도록 한다. (아래 실행결과 참조)


▶ 실행 결과 :



▶ 포인트 


- enum { Monday, Tuesday=1, Wednsday=2, Thursday, Friday, Saturday, Sunday }  와 같은 형태로 사용할 수 있다.

- enum 의 상수 값은 지정 하지 않으면 0부터 순서대로 할 당 된다. 

 (7개의 인자가 있고 모두 초기 값이 없는 경우 할당 되는 상수 값은 : 0~6 이다)

 (만약 첫 번째 인자의 초기값만 3으로 지정하면, 상수 값은 : 3~9 가 할당 된다)



▶ 프로그램 : 


(이미지 클릭, 확대보기 하세요)




+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




▶ 소스코드 다운로드 :  

40 열거형 이해하기 코드.cpp







반응형
반응형

【 C 언어 】 #39 구조체 이해하기2 (배열, for문 활용)



 앞 글에서, 구조체를 이용하는 법에 대해 다루었고, 배열을 살짝 활용하는 것을 보았다.  본격적으로 구조체, 배열, for문 등을 이용한 프로그래밍을 통해 구조체에 좀 더 익숙해져 보도록 하자. 


▶ 문제  : 국,영,수 3과목, 각 10개의 점수에 대해 구조체 배열 및 for 문을 사용하여 1차 (국어="  ", 영어="  ", 수학="  ") ~ 10차(국어="  ", 영어="  ", 수학="  ") 성적 값을 화면에 출력 하라.



▶ 포인트 


- 구조체 속에 국, 영, 수 각각의 요소에 대해 배열로 10개의 데이터를 선언한다


- 배열의 인자 값을 for문을 사용하여 편하게 출력한다. 




▶ 프로그램 : 




▶ 실행 결과 :


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 연습 과제  :  위 프로그램에서 각 과목의 평균값 혹은 차수별 3과목 평균값을 추가로 구해서 출력 해보자.


 (잊지 말자~!  충분한 연습은 충분한 실력으로 되돌아 온다)


▶ 소스코드 다운로드 :  


38 구조체 이해하기4(배열for문).cpp






반응형
반응형

【 C 언어 】 #38 구조체 이해하기



 구조체는 구조적인 프로그래밍을 작성하기 위해 사용되며, 배열과 비슷한 구조를 띄고 있다. 배열과 다른 점은,  배열은 동일한 데이터형에 대하여 여러개를 정의 하는 것이고, 구조체는 서로 다른 데이터형을 하나의 묶음으로 처리(관리)하기 위해 사용되는 차이점이 있다. 또한 C++에서의 클래스(class)라는 개념으로 바뀌어 사용된다. 


▶ 문제  : 국,영,수 3과목 성적 값의 평균을 구하는 문제를 구조체를 사용하여 작성하라.



▶ 포인트 


- 구조체는 같은 유형의 데이터가 아니더라도 하나의 묶음(구조)으로 관리 할 수 있어 , 좀 더 편하게 프로그래밍을 짤 수 있게 해준다. 

- 묶어야 할 요소들을 "struct XXX" {  ...   };  형태로 선언 한다. 

- 메인 함수내에서 변수명과 함께 선언하게 되면(struct XXX YY; )  , 

  YY.kor = 100;   형태로 구조체 내에 있는 요소들을 활용 할 수 있다.



▶ 프로그램 : 




▶ 실행 결과 :


▶ 보충설명 :


- 구조체 이름은 서로 다를 수 있는 개체들을 묶은 템플릿의 이름에 해당 된다. 

  (주의 : 구조체 선언의 끝( '}' )에 ';' 세미콜론을 넣어야 한다.


- 구조체를 사용하기 위해서는 변수명을 하나 정하여 구조체를 선언해야 사용할 수 있다.   ( struct Average SCORE; )   주의 : 반드시 선언부 끝에 세미 콜론이 들어감.


- 구조체 사용은 SCORE.kor 형태로 ,  선언명(SCORE) 과 사용하고자 하는 요소값을 ' . ' 로 연결하여 사용한다.  

 (예, 국어 점수 kor에 100점 입력하기 : SCORE.kor = 100; )


 - 구조체를 배열 형태로 사용할 수 도 있다. 

 (예,  struct Average KOR[10];     : 국어 점수 10개를 배열 형태로 사용할  수 있다.  KOR[0] , KOR[1] , ....  KOR[9]   )

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 응용 연습 문제 1 :   위 프로그램을 기본으로 국어 점수 3개를 구조체 배열을 사용하여 평균값을 구하여라. 



▶ 프로그램1 :  (아래 코딩에서 빠진 영어, 수학 성적도 추가 해 넣으면 된다.)




▶ 실행 결과1 :




▶ 소스코드 다운로드 :  


38 구조체 이해하기.cpp


38 구조체 이해하기2.cpp






반응형

【 C 언어 】 #37 NULL 널 문자 이해하기

Language/C & C++ 2018. 5. 3. 11:03 Posted by 엑소더스팩토리
반응형

【 C 언어 】 #37 NULL 문자 이해하기



 문자열 길이를 구하는 문제를 통해 NULL 문자에 대해 이해 할 수 있다.  


▶ 문제  : 문자열 길이(예, abcdefg: 길이 7) 를 구하는 코드를 작성하라. 



▶ 포인트 


- 문자열의 끝은 항상 NULL('\0')문자 로 종료된다.

NULL 문자는 아스키 코드 값  '0' 이다

- 문자열 길이를 구하는 함수를 따로 작성하여 코딩한다.

- 문자형 포인터 변수(*pstr)를 사용하여 코딩한다.

- *pstr 은 pstr이 가리키는 번지에 저장되어 있는 값을 의미한다. 



▶ 프로그램 : 


# 이미지를 클릭하면 확대 되어 선명하게 보실 수 있습니다.


▶ 실행 결과 :


▶ 보충설명 :


- *pstr 은 pstr이 가리키는 번지에 저장되어 있는 값을 의미한다.  따라서 pstr은 번지(주소) 라는 것을 이해 해야 한다.

- pstr은 문자열의 선두 번지를 가리키고 있기 때문에, pstr의 번지가 1씩 증가(pstr++)함에  따라 *pstr의 값은 첫 번째 값 a 부터...  b, c, d, e, f, g, \0  처럼 된다.

- while문에서 NULL문자('\0') 의 아스키 값은 '0' 이기 때문에 문자열 끝을 알리는 NULL 문자를 만나면 while 문을 빠져 나오게 된다.

- pstr++;   은 pstr의 번지를 1만큼 증가 시킨다(pstr은 포인터 변수 이기 때문)

- len++;   은 문자열 길이 값을 1만큼 증가 시킨다


 문자열 'abcdefg' 가 메모리에 저장된 모습을 그림으로 그려 보면 아래와 같다.

문자열의 첫 번째 a가 저장된 번지를 '1000'번지라고 가정 해 보자.


# 이미지를 클릭하면 확대 되어 선명하게 보실 수 있습니다.


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 소스코드 다운로드 :  


37 NULL 넌 문자 이해하기-코드.cpp






반응형

【 C 언어 】 #36 문자열 포인터 이해하기

Language/C & C++ 2018. 4. 23. 17:28 Posted by 엑소더스팩토리
반응형

【 C 언어 】 #35 문자열 포인터 이해하기



 포인터 는 C언어에서 종종 중요하게 사용된다. 포인터를 이용하여 메모리로 직접 접근이 용의하고 하드웨어적인 부분을 직접 컨트롤 할 수 있기 때문이다.

다만 처음 개념 이해가 어려울 수 있으나 예제 내용을 바꾸어가며 테스트해 보면 비교적 쉽게 이해될 것이다. 

 앞선 글에서 정수형 변수를 가지고 포인터를 활용하는 법을 설명하였는데, 문자열도 문자열 포인터 변수로 선언하여 분신으로 사용 가능하다.  단, 이때는 분신연산자(&)를 붙이지 않고 선언한다. 예를 들면, "RasINO"를 'RINO'라는 문자열 포인터로  선언하게 되면, "RasINO"를 사용할 모든 곳에 RINO라고 사용할 수 있다.  또한 배열 포인터 형태로 사용하면 된다.


▶ 문제  : 문자열 "RasINO" 를 문자열 포인터 변수로 선언하고 출력하라.



▶ 포인트 


- 문자나 문자열은 puts();  함수를 이용하여 출력한다. 

- 문자열은 "  " 이중따움표로 표시한다.

- 문자열"RasINO"를 배열에 넣고 배열을 문자열 포인터로 지정한다



▶ 프로그램 : 




▶ 실행 결과 :


▶ 보충설명 :


string[0] 과 pstr[0]은 그 값이 같다

문자열 포인터 선언시에는 분신연산자 '&'를 사용하지 않음에 유의 한다. 

단, 배열의 특정 요소부터 출력시킬 때는 '&'를 사용해야 한다. 

(예, pstr2 = string; 

     puts (&psr2[1])   // 'sINO'  가 출력 됨)





+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



▶ 소스코드 다운로드 :  


36 문자열 포인터 이해하기-코드.cpp





반응형