#include <stdio.h>

#pragma warning(disable:4715)

typedef enum { Ascending, Descending } SORT_COMPARE_TYPE;
typedef int (*fnSortCompare)(int[], int, int);

fnSortCompare getFuncCompare(SORT_COMPARE_TYPE sortCompareType);
int AscCompare(int Arr[], int i, int j);
int DescCompare(int Arr[], int i, int j);
void Swap(int Arr[], int i, int j);

void Sort(int Arr[], int nSize, SORT_COMPARE_TYPE sortCompareType);
void PrintAll(int Arr[], int nSize);

int main(void)
{
	int Arr[] = {10, 50, 40, 70, 90, 100, 20, 30, 80, 60};
	int nSize = sizeof(Arr) / sizeof(Arr[0]);

	printf("Sort Before......\n");
	PrintAll(Arr, nSize);
	Sort(Arr, nSize, /* SORT_COMPARE_TYPE */ Ascending);
	printf("Sort After......\n");
	PrintAll(Arr, nSize);

	return 0;
}

fnSortCompare getFuncCompare(SORT_COMPARE_TYPE sortCompareType)
{
	switch (sortCompareType)
	{
	case Ascending:
		return AscCompare;
	case Descending:
		return DescCompare;
	}
}

void Sort(int Arr[], int nSize, SORT_COMPARE_TYPE sortCompareType)
{
	int i = 0, j = 0;
	fnSortCompare sortCompare = getFuncCompare(sortCompareType);
	for (; i < nSize - 1; i++) 
	{
		for (j = i + 1; j < nSize; j++)
		{
			if (sortCompare(Arr, i, j) > 0)
			{
				Swap(Arr, i, j);
			}
		}
	}
}

int AscCompare(int Arr[], int i, int j)
{
	return Arr[i] > Arr[j];
}

int DescCompare(int Arr[], int i, int j)
{
	return Arr[i] < Arr[j];
}

void Swap(int Arr[], int i, int j)
{
	int nTemp = Arr[i];
	Arr[i] = Arr[j];
	Arr[j] = nTemp;
}

void PrintAll(int Arr[], int nSize)
{
	int i = 0;
	for (; i < nSize; i++)
	{
		printf("[%d]", Arr[i]);
	}
	printf("\n");
}

'C' 카테고리의 다른 글

[C] - 환경변수 출력  (0) 2014.09.08
[C] - const 포인터 사용법  (0) 2014.09.08
[C] - 스캔셋(Scanset)  (0) 2014.09.08
[C] - scanf() 함수  (0) 2014.09.08
[C] - getchar(), _getch(), _getche() 차이점  (0) 2014.09.08
블로그 이미지

행복그리고..

,

[C] - 환경변수 출력

C 2014. 9. 8. 17:02
#include <stdio.h>
 
int main(int argc, char* argv[], char* pEnv[])
{
    int i = 0;
    char** dpEnv = NULL;
 
    for(dpEnv = pEnv; *dpEnv; ++dpEnv, ++i)
    {
        printf("Environment[%d] : %s\n", i, *dpEnv);
    }
 
    getchar();
    return 0;
}

'C' 카테고리의 다른 글

[C] - 오름차순(Ascending) 내림차순(Descending) 정렬  (0) 2014.10.14
[C] - const 포인터 사용법  (0) 2014.09.08
[C] - 스캔셋(Scanset)  (0) 2014.09.08
[C] - scanf() 함수  (0) 2014.09.08
[C] - getchar(), _getch(), _getche() 차이점  (0) 2014.09.08
블로그 이미지

행복그리고..

,
#include <stdio.h>

int main(void)
{
	char hello[] = "Hello";
	char world[] = "World";

	/* 비상수 포인터, 비상수 데이터 */
	/* const char *p = hello; */
	/* p[0] = h */

	/* 비상수 포인터(주소값 변경 가능), 상수 데이터(값 변경 불가능) */
	/* const char *p = hello; */
	/* p = world; */

	/* 상수 포인터(주소값 변경 불가능), 비상수 데이터(값 변경 가능) */
	/* char *const p = hello; */
	/* p[0] = 'h'; */

	printf("%s\n", p);
}

'C' 카테고리의 다른 글

[C] - 오름차순(Ascending) 내림차순(Descending) 정렬  (0) 2014.10.14
[C] - 환경변수 출력  (0) 2014.09.08
[C] - 스캔셋(Scanset)  (0) 2014.09.08
[C] - scanf() 함수  (0) 2014.09.08
[C] - getchar(), _getch(), _getche() 차이점  (0) 2014.09.08
블로그 이미지

행복그리고..

,

[C] - 스캔셋(Scanset)

C 2014. 9. 8. 15:52

스캔셋(Scanset)은 기본적으로 %s와 유사하지만 모든 문자열을 입력받는 것이 아니라 별도로 기술한 범위에 속하는 것들만 골라서 입력을 받는다는 점이 다릅니다. 그리고 그 범위에 속하지 않는 문자가 등장하는 지점에서 입력을 끝내버립니다. %s는 입력 구분을 의미하는 공백 문자를 처리할 수 없었지만 스캔셋을 이용하면 scanf()함수가 gets()함수처럼 작동하게 할 수도 잇습니다.


#include <stdio.h>

int main(void)
{
	char szBuffer[32] = { NULL };

	scanf("%[A-Z]", szBuffer);
	puts(szBuffer);

	scanf("%s", szBuffer);
	puts(szBuffer);
	return 0;
}

스캔셋은 %[]형식 문자로 기술합니다. 내부적으로 사용자가 입력한 문자열을 스캔셋을 근거로 구문 분석하고 걸러내어 조건에 맞는 문자들을 골라서 저장합니다. 그리고 조건에 맞지 않는 문자가 등장하면 더는 읽어 내지 않고 멈춥니다. 

예를들어 "TESTstring"이라고 입력했다면 "TEST"까지만 배열에 저장합니다. 그래서 실행결과는 TEST 후에 버퍼에 남아있는 string이 출력됩니다. 아래의 scanf()함수는 버퍼에 문자열이 남아있기때문에 입력을 받지 못하는 경우입니다. 


그리고 읽어내고 싶은 범위를 여럿 명시하고 싶다면 반점(,)을 이용하면 됩니다.

#include <stdio.h>

int main(void)
{
	char szBuffer[32] = { NULL };

	scanf("%[^A-Z]", szBuffer);
	puts(szBuffer);

	scanf("%s", szBuffer);
	puts(szBuffer);
	return 0;
}

가령 %[A-Z, a-z]라고 명시하면 영문 대문자와 소문자 모두가 범위로 지정됩니다. 만일 공백 문자를 삽입하여 %[ A-Z,a-z]라고 기술하면 공백 문자를 입력의 구분자로 사용하지 않고 일반 문자처럼 그냥 읽어내어 메모리에 저장해줍니다. 또한 ^기호를 이용하면 입력 범위가 아니라 입력받지 않을 범위를 지정할 수 있습니다. 


scanf()함수로 gets()함수처럼 사용할수 있다.

#include <stdio.h>

int main(void)
{
	char szBuffer[32] = { NULL };

	scanf("%[^\n]%*c", szBuffer);
	puts(szBuffer);

	gets(szBuffer);
	puts(szBuffer);
	return 0;
}

%[^\n]이 의미하는 것은 줄 바꿈 문자를 제외한 나머지 모든 문자를 의미합니다. 따라서 gets()함수처럼 공백 문자도 입력받을 수 있습니다. 그리고 이어서 %*c 형식 문자를 조합함으로써 입력 버퍼에 남을 줄 바꿈 문자를 제거함으로써 이후에 나오는 gets()함수에서 키보드로부터 입력을 받을 수 있습니다.


[ 출저 ] - 명강의로 완성하는 C 프로그래밍

'C' 카테고리의 다른 글

[C] - 환경변수 출력  (0) 2014.09.08
[C] - const 포인터 사용법  (0) 2014.09.08
[C] - scanf() 함수  (0) 2014.09.08
[C] - getchar(), _getch(), _getche() 차이점  (0) 2014.09.08
[C] - 동적으로 할당된 메모리 크기 알기  (0) 2014.09.08
블로그 이미지

행복그리고..

,

[C] - scanf() 함수

C 2014. 9. 8. 15:51
#include <stdio.h>

int main(void)
{
	int nData = 0;
	char chCode = 0;

	printf("Data : ");
	scanf("%d", &nData);
	chCode = getchar();
	printf("Data : %d\n", nData);
	printf("chCode : %d\n", chCode);
	
	return 0;
}

scanf()함수로 정수를 입력하였을때 버퍼에는 \n문자가 남아있다는걸 chCode변수로 확인 할 수 있습니다. 그래서 보통에 경우에는 fflush(stdin); 코드로 플러싱을 해줍니다.

#include <stdio.h>

int main(void)
{
	int nData = 0;
	char chCode = 0;

	printf("Data : ");
	scanf("%d%*c", &nData);
	chCode = getchar();
	printf("Data : %d\n", nData);
	printf("chCode : %d\n", chCode);
	
	return 0;
}

%d 형식 문자 외에 %*c라는 형식 문자가 추가된 형태인데, 이것은 문자 하나를 입력 버퍼에서 읽어온 후 그냥 버린다는 의미입니다. 따라서 정수와 함께 입력한 줄 바꿈 문자가 버퍼에서 꺼내어지고 버려집니다. 


위의 코드를 실행해보시면 다시 버퍼가 비워져 다시 getchar()함수가 실행되는것을 보실 수 있습니다. 


scanf()의 형식 문자에서 %기호와 형식 문자 사이에 위치한 *는 '버림'을 의미합니다. 오로지 윈도우 환경만 고려해도 된다면 fflush(stdin); 같은 코드도 나쁘지 않습니다. 그러나 다양한 환경을 모두 고려해야 한다면 반드시 두 번째 해결 방법을 이용해야 합니다.


[ 출저 ] - 명강의로 완성하는 C 프로그래밍

'C' 카테고리의 다른 글

[C] - 환경변수 출력  (0) 2014.09.08
[C] - const 포인터 사용법  (0) 2014.09.08
[C] - 스캔셋(Scanset)  (0) 2014.09.08
[C] - getchar(), _getch(), _getche() 차이점  (0) 2014.09.08
[C] - 동적으로 할당된 메모리 크기 알기  (0) 2014.09.08
블로그 이미지

행복그리고..

,

getchar() - Buffered I/O

키보드 장치의 입출력을 위해 할당된 버퍼에서 한 글자를 빼내서 반환해주는 함수라 할 수 있습니다.

버퍼의 내용을 보면 맨 마지막에 \n이 들어 있는 것을 볼 수 있습니다. 마지막에 Enter키를 눌렀을때 \n 버퍼안에 있으므로 

플러싱 작업을 해줘야 한다.

#include <stdio.h>
int main(void)
{
	char ch = 0;

	ch = getchar();
	putchar(ch);
	ch = getchar();
	putchar(ch);
	ch = getchar();
	putchar(ch);
	ch = getchar();
	putchar(ch);
	ch = getchar();
	putchar(ch);
	return 0;
}

_getch(), _getche() - Non-Buffered I/O 

getchar() 함수는 사용자가 입력한 문자가 어떤 것인지 그 정보 자체를 다루려는 목적이 강한 반면 _getch(),_getche()함수는 어떤 문자가 입력된 것인지 구체적인 정보를 알려는 목적보다는 단지 아무 키나 눌려서 사용자 입력이 발생했음을 감지하려는 목적이 더 강합니다.

#include <stdio.h>
#include <conio.h>

int main(void)
{
	char ch = 0;

	printf("아무 키나 누르면 다음으로 넘어갑니다. \n");
	ch = _getch();

	printf("입력한 키는 ");
	putchar(ch);
	printf("입니다.\n");
		
	return 0;
}

글자를 입력하는 과정에서 getchar()함수처럼 문자열을 입력하고 입력의 완료를 위해 Enter 키를 누를 필요가 없습니다. 왜냐하면 _getch()함수가 한 글자라도 입력되면 즉시 반환하기 때문입니다. 그리고 어떤 키가 눌렸는지 화면에 보이지 않습니다. 그러나 _getche()함수는 어떤 키가 눌렸는지 화면에 출력하고 함수가 반환한다는 점에서 차이가 있습니다. 


버퍼를 거쳐 정보의 입출력이 이루어지는 것을 Buffered I/O라고 합니다. 반대로 버퍼를 이용하지 않는 입출력을 Non-Buffered I/O라고 합니다.


[ 출저 ] - 명강의로 완성하는 C 프로그래밍

'C' 카테고리의 다른 글

[C] - 환경변수 출력  (0) 2014.09.08
[C] - const 포인터 사용법  (0) 2014.09.08
[C] - 스캔셋(Scanset)  (0) 2014.09.08
[C] - scanf() 함수  (0) 2014.09.08
[C] - 동적으로 할당된 메모리 크기 알기  (0) 2014.09.08
블로그 이미지

행복그리고..

,
#include <stdio.h>
#include <malloc.h>
 
typedef struct _Person
{
    char Name[20];
	int Age;
} Person;
 
void HeapMemorySize(void* _Memory)
{
    printf("HeapMemorySize : %d\n", _msize(_Memory));
}
 
int main(void)
{
    char* pszData = (char*)malloc(sizeof(char) * 10);
    int* pnData = (int*)malloc(sizeof(int) * 10);
    Person* pPerson = (Person*)malloc(sizeof(Person));
 
    HeapMemorySize((void*)pszData);
    HeapMemorySize((void*)pnData);
    HeapMemorySize((void*)pPerson);
 
    return 0;
}

동적으로 할당된 메모리의 크기는 할당 당시에 확실히 명시해야 하므로 할당받는 처지에서는 그 크기를 모를 수가 없습니다. 그러나 간혹 함수 단위로 코드가 분할되면서 포인터로 주소를 받긴 하지만 크기를 받지 못해 할당된 메모리 크기를 모를 때도 있습니다. 이때 윈도우 운영체제의 경우 _msize()함수를 이용하면 크기를 알아낼 수 있습니다.

(참고로 리눅스, 유닉스는 malloc_usable_size() 함수를 사용합니다.)


[ 출저 ] - 명강의로 완성하는 C 프로그래밍

'C' 카테고리의 다른 글

[C] - 환경변수 출력  (0) 2014.09.08
[C] - const 포인터 사용법  (0) 2014.09.08
[C] - 스캔셋(Scanset)  (0) 2014.09.08
[C] - scanf() 함수  (0) 2014.09.08
[C] - getchar(), _getch(), _getche() 차이점  (0) 2014.09.08
블로그 이미지

행복그리고..

,