728x90

prob19
prob20
prob21-1
prob21-2
prob22
prob23

 문자열 함수들 구현하기

 

prob24

strtok 함수 구현하기 - 능력부족으로 어렵게 느껴짐

 

 

====================strtok 함수 구현 모범 답안====================================

728x90

'Programming > C' 카테고리의 다른 글

C구조체 연습문제  (0) 2019.09.08
C 메모리 동적할당 연습  (0) 2019.08.31
C문자와 문자열 처리  (0) 2019.08.23
C간단한 알고리즘 연습  (0) 2019.08.23
C조건문 반복문 연습  (0) 2019.08.15
728x90

prob15
prob16
prob17
prob18

728x90

'Programming > C' 카테고리의 다른 글

C 메모리 동적할당 연습  (0) 2019.08.31
C다양한 함수 만들기  (0) 2019.08.23
C간단한 알고리즘 연습  (0) 2019.08.23
C조건문 반복문 연습  (0) 2019.08.15
C 콘솔 입출력 연습  (0) 2019.08.15
728x90

prob12-1
prob12-2
prob13
prob14 버블소트

 

728x90

'Programming > C' 카테고리의 다른 글

C다양한 함수 만들기  (0) 2019.08.23
C문자와 문자열 처리  (0) 2019.08.23
C조건문 반복문 연습  (0) 2019.08.15
C 콘솔 입출력 연습  (0) 2019.08.15
구조체 연습문제  (0) 2019.08.11
728x90

prob9-1
prob9-2
prob10
prob11-1
prob11-2

728x90

'Programming > C' 카테고리의 다른 글

C문자와 문자열 처리  (0) 2019.08.23
C간단한 알고리즘 연습  (0) 2019.08.23
C 콘솔 입출력 연습  (0) 2019.08.15
구조체 연습문제  (0) 2019.08.11
파일 입출력 연습  (0) 2019.07.23
728x90

prob1

scanf(" ~~~~" , &)

위 처럼 scanf안의 첫번째 인자값의 큰따옴표 안의 내용이 입력 폼이된다.

scanf("=====%d=====",&a); 라고 되어있으면 콘솔 입력을 할 때도 =====5===== 이런식으로 입력해줘야한다.

scanf함수의 특징은 입력 포맷을 지정해줄 수 있는것이다.

 

prob2

scanf 함수는 공백을 입력받지 않는다. 문자열에 공백이 포함되어있다면 scanf가 아닌 fgets를 사용하는것이 좋다.

 

prob3

scanf 함수에 %x를 사용하면 입력받는 데이터를 16진수로 인식한다. 포맷을 설정해주는 scanf의 유용함

%o는 8진수 %x는 16진수이다.

 

prob4-1

windows에서는 EOF를 ctrl+z로 정의되어있고 유닉스 계열에서는 ctrl+d로 정의되어있다. getchar()!='\n'은 입력 버퍼를 비우기 위해 넣어두었다.

prob4-2

scnaf함수는 반환값으로 서식문자에 정상적으로 입력된 값의 개수를 반환한다. 예를 들어 scanf("%d %d %d",&a,&b&c)함수가 정상적으로 10진수 3개가 입력되었다면 반환값은 3이다.

 

728x90

'Programming > C' 카테고리의 다른 글

C간단한 알고리즘 연습  (0) 2019.08.23
C조건문 반복문 연습  (0) 2019.08.15
구조체 연습문제  (0) 2019.08.11
파일 입출력 연습  (0) 2019.07.23
C라이브러리  (0) 2019.07.17
728x90

windows는 MBCS와 WBCS를 모두 사용가능한 프로그램 구현을 위해 매크로를 정의하고 있다.

#ifdef UNICODE

           typedef  WCHAR TCHAR;

           typedef  LPWSTR LPTSTR;

           typedef  LPCWSTR LPCTSTR;

#else

           typedef  CHAR TCHAR;

           typedef  LPSTR LPTSTR;

           typedef  LPCSTR LPCTSTR;

#endif

 

아래는 windows.h에 포함되지 않는 tchar.h 에 선언된 일부이다.

#ifdef _UNICODE

        #define  __T(x)   L##x

#else

        #define  __T(x)    x

 

#define     _T(x)      __T(x)

#define     _TEXT(x)   __T(x)

 

 

ex)

TCHAR arr[10];

위 선언이 되어 있고 UNICODE 매크로가 정의되어 있지 않다면 CHAR arr[10];이다.

UNICODE 매크로가 정의되어 있다면  WCHAR arr[10];이다.

 

매크로 UNICODE가 정의되어있다면

TCHAR arr[10];   ->   WCHAR arr[10];     ->     wchar_t arr[10];

매크로 UNICODE가 정의되어 있지 않다면

TCHAR arr[10];   ->    WCHAR arr[10];   ->     char arr[10];

 

ex)

__T("ABCDE");

위. 선언이 있고 _UNICODE 매크로가 정의되어 있지 않다면, MBCS타입 문자열로 변경된다.

"ABCDE"

 

_UNICODE 매크로가 정의되어 있다면 WBCS기반의 문자열이 된다.

L"ABCDE"

 

매크로 _UNICODE가 정의되면

_T("ABCDE")   ->     __T("ABCDE")    -> L"ABCDE"

매크로 _UNICODE가 정의되어 있지 않다면

_T("ABCDE")   ->     __T("ABCDE")     -> "ABCDE"

 

MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 함수들

tchar.h에 있는 MBCS, WBCS매크로

#ifdef _UNICODE

                #define              _tmain                     wmain

                #define              _tcslen                     wcslen

                #define              _tcscat                     wcscat

                #define              _tcscpy                    wcscpy

                #define              _tcscmp                   wcscmp

                #define              _tprintf                    wprintf

                #define              _tscanf                    wscanf

                #define              _fgetts                    fgetws

                #define              _fputts                    fputws

#else

                #define              _tmain                     main

                #define              _tcslen                     strlen

                #define              _tcscat                     strcat

                #define              _tcscpy                    strcpy

                #define              _tcscmp                   strcmp

                #define              _tprintf                    printf

                #define              _tscanf                    scanf

                #define              _fgetts                    fgets

                #define              _fputts                    fputs

#endif

 

printf("string length : %d \n", size);

위 문장은 MBCS기반으로 컴파일된다. 유니코드기반으로 컴파일하기 위해선 아래처럼 바꿔야 한다.

wprintf(L"string length : %d \n",size);

MBCS, WBCS기반으로 _UNICODE 정의에 따라 달라지는 함수들의 선언이 tchar.h에 선언되어 있다.  

728x90
728x90

window에서의 유니코드(UNICODE)

 

아스키코드 : 미국에서 정의하고 있는 표준 알파벳 26개와 몇몇 확장문자(수학기호, 악센트 기호)등을 합쳐 256개 즉 1바이트로 표현이되는 문자들이다.

 

유니코드 : 영어가 아닌 다른 국가에서 사용하는 문자들을 표현하기 위해 등장했다. 유니코드는 문자를 표현하는데 균일하게 2바이트를 사용한다. 2바이트 크기인 65536개의 문자를 표현할 수 있다. 한글, 영어를 포함한 전세계의 다양한 문자, 다양한 기호를 표현가능하다.

 

문자셋의 종류

1.SBCS(Single Byte Character Set)

문자를 표현하는데 있어서 1바이트만 사양하는 방식. 아스키 코드가 대표적인 SBCS이다.

 

2.MBCS(Multi Byte Character Set)

어떤문자는 1바이트, 어떤문자는 2바이트로 표현한다. 유니코드는 MBCS에 속하지 않는다. MBCS는 SBCS를 포함하고 있다. 아스키 코드에서 정의한 문자들은 1바이트로 처리하고, 아스키코드에서 정의하지 않은 다른문자를 표현할 때는 2바이트로 처리한다. MBCS에서 영어는 1바이트로, 한글은 2바이트로 처리된다.

 

3.WBCS(Wide Byte Charactor Set)

유니코드가 WBCS방식에 해당한다. WBCS는 모든 문자를 2바이트로 처리하는 문자셋이다.

 

ex)

str = "ABC한글"

sizeof(str)은 8이다.

strlen(str)은 7이다.

 

8바이트가 나온것은 ABC(3바이트) + 한글(4바이트) + NULL(1바이트)해서 총 8바이트이다. 이것은 현재 MBCS 기반으로 실행되고 있는 것이다.

 

문자열길이는 7이라고 출력되었다. 문자열 길이에서 NULL은 제외된다. "ABC한글"은 실제로 문자열길이는 5지만 "한글"이라는 단어가 4로 인식되고 있다. 이와 같은 문제점이 MBCS의 문제점이다.

 

MBCS 방식의 문제점을 해결하는 것이 WBCS방식이다. WBCS방식은 모든 문자들을 2바이트로 처리한다.

 

 

WBCS 기반의 프로그래밍

 

WBCS 프로그래밍에서는 char 대신 wchar_t를 사용해야 한다. char형은 1바이트만 할당되지만 wchar_t형 변수는 2바이트 메모리 공간이 할당된다. wchar_t를 통해 유니코드를 기반으로 문자를 표현하는 것이 가능하다.

 

wchar_t의 자료형

typedef unsigned short wchar_t;

 

"ABC"대신 L"ABC"를 사용해야한다.

ex) wchar_t str[] = L"ABC"

문자열앞의 L은 유니코드 기반(WBCS 기반)으로 표현하라는 의미를 가지고 있다. 위 경우에는 "ABC"는 NULL을 포함해 총 8바이트로 표현된다. 유니코드에서는 NULL문자 까지도 2바이트로 처리된다.

 

문자열 조작 함수

      SBCS                                                      WBCS

     strlen                                      size_t wcslen(const wchar_t * string);

     strcpy                                     wchar_t * wcscpy(wchar_t * dest, const whcar_t * src);

     strncpy                                   wchar_t * wcsncpy(wchar_t * dest, const wchar_t * src, size_t cnt);

     strcat                                     wchar_t * wcscat(wchar_t * dest, const wchar_t * src);

     strncat                                    wchar_t * wcsncat(wchar_t * dest, const wchar_t * src, size_t cnt);

     strcmp                                   int wcscmp(const wchar_t * s1, const wchar_t * s2);

     strncmp                                 int wcsncmp(const wchar_t * s1, const wchar_t *s2, size_t cnt);

 

WBCS기반 함수의 전달인자는 모두 유니코드 기반 문자열이다.

 

입출력 함수

printf("Hello World!");

"Hello World!"는 아스키코드에 존재하는 문자들로만 구성되어 있으므로 문자당 1바이트로 표현된다. printf함수는 SBCS기반 문자열을 처리하는 함수다. 유니코드 기반으로 작성할려면 아래와 같이 작성해야 한다.

wprintf(L"Hello World!");

printf함수의 유니코드 버전이 wprintf 함수이다.

 

     SBCS                                                         WBCS

   printf                                                      int wprintf(const wchar_t * format [ ,argument] ....);

   scanf                                                      int wscanf(const wchar_t * format [ ,argument]......);

   fgets                                                        wchar_t * fgetws(wchar_t * string, int n, FILE * stream);

   fputs                                                       int fputws(const wchar_t * string, FILE * stream);

 

 

wmain은 프로그램 실행시 전달되는 문자열을 유니코드 기반으로 구성한다는 의미이다.

 

 

 

 

728x90
728x90

791-1
791-3
792-5

728x90

'Programming > C' 카테고리의 다른 글

C조건문 반복문 연습  (0) 2019.08.15
C 콘솔 입출력 연습  (0) 2019.08.15
파일 입출력 연습  (0) 2019.07.23
C라이브러리  (0) 2019.07.17
인라인 함수 와 _Noreturn 함수  (0) 2019.07.17

+ Recent posts