2011. 10. 12. 20:04

"%[parameter][flags][width][.precision][length]type"

Parameter 

Character 

Description 

n$ 

파라미터 지정

This is a POSIX extension and not in C99.

Example: printf("%2$d %1$#x %1$d",16,17) produces "17 0x10 16"

 

Flags

Character 

Description 

+ 

양수 '+', 음수 '-' 기호 출력. (디폴트 : 아무것도 표시 안함)

- 

좌측 정렬

# 

8진수, 16진수 출력시 각각 0과 0x를, 실수의 경우 소수점 이하 0을 출력

' '공백

출력할 크기가 0보다 클 때 수의 앞에 빈 칸 하나 출력

0 

빈공간을 0으로 체움

 

Width

Character

Description 

* or N

폭 지정 (*와 같은 경우 숫자와 대응)

Example: printf("%*d", 5, 10) will result in " 10" being printed with a width of 5.

 

Precision

Character 

Description 

* or N

정밀도 지정 (*와 같은 경우 숫자와 대응)

정수의 경우-> 지정한 숫자보다 개수가 작을 경우 나머지 0으로 표시

실수의 경우-> 소수점 자리 수

문자열의 경우-> 지정한 개수만큼의 문자 표시

Example: printf("%.*s", 3, "abcdef") will result in "abc" being printed.

 

Length

Character 

Description 

h 

정수 자료형 감소 (int-> short)

hh 

정수 자료형 2번 감소 (int-> short-> char)

l 

정수 자료형 증가(int-> long)

ll 

정수 자료형 2번 증가(int-> long-> long long)

L 

실수 자료형 증가 (long -> long double)

z 

For integer types, causes printf to expect a size_t sized integer argument.

j 

For integer types, causes printf to expect a intmax_t sized integer argument.

t 

For integer types, causes printf to expect a ptrdiff_t sized integer argument.

 

Type

Character 

Type

Description 

d, i 

int 

부호 있는 10진수 정수

u 

unsigned int 

부호 없는 10진수 정수

o 

unsigned int 

부호 없는 8 진수 정수

x, X 

unsigned int 

부호 없는 16진수 정수

f, F 

double 

10진수 방식의 부동 소수점 실수

e, E 

double 

지수 형식으로 출력

g, G 

double 

%e와 %f 중 짧은 쪽, 소수점에 이어지는 0은 생략

c 

int 

값에 대응하는 문자

s 

char * 

문자열

p 

void * 

포인터 주소값

n 

int * 

포인터 주소값

% 

literal '%' 

리터럴 '%' 문자( 플래그, 폭, 정밀, 길이 허용 안함)

Posted by devanix
2011. 10. 8. 02:41

<stdlib.h>

int rand ( void );

void srand ( unsigned int seed );

 

#define RAND_MAX 2147483647 (32bit 리눅스 시스템 기준)

리턴값

rand : 0부터 RAND_MAX 사이의 의사 난수를 생성 반환.

설명

rand()는 0부터 RAND_MAX 사이의 난수를 생성하지만,

문제는 프로그램을 새로 실행할 때 마다 매번 다른 난수를 만들어 내지 않고

계속 같은 난수를 반복합니다.

그래서 srand()를 사용하여 의사 난수를 생성하기 위해서 난수의 생성 초기값인

seed값을 지정합니다. (보통 seed는 srand((unsigned) time(NULL))로 설정)

 

srand()가 호출되기 전에 rand()가 호출되면 디폴트 값은 1이 됩니다.

 

보통 seed는 srand((unsigned) time(NULL))로 지정하지만 time()는 초 단위이기 때문에

1초 이내에 여러 번 실행하게 되면 같은 난수가 중복되기 때문에 getpid()와 함께

사용합니다. getpid()는 같은 프로그램을 실행해도 매번 실행할 때 마다

프로세스 아이디가 계속 증가되기 때문에 매번 다른 값을 반환하게 됩니다.

이런 이유로 time()같이 사용합니다.

 

예 : srand( (unsigned)time(NULL)+(unsigned)getpid() );

 

 

[ rand의 난수 생성범위에 따른 함수 사용 방법: ]

난수 생성범위

프로그램 연산식

설명

1 <= 정수난수 <= 45

rand() % 45+1;

45로 나눈 나머지 값의 범위는 0~44,

이 값에 1을 더하므로 1~5 사이의 난수 생성

0 <= 정수난수 <= 99

rand() % 100;

100으로 나눈 나머지 값의 범위는 0~99이므로

0~99 사이의 난수 생성.

10 <= 정수난수 <= 30

rand() % 21 + 10;

21로 나눈 나머지 값의 범위는 0~20,

이 값에 10을 더해주면 10~30 사이의 난수 생성.

-5 <= 정수난수 <= 5

rand() % 11 - 5;

11로 나눈 나머지 값의 범위는 0~10,

이 값에 5를 감해주면 -5~+5 사이의 난수 생성.

0 <= 실수난수 <= 1

rand()/(double)RAND_MAX

0~RAND_MAX의 사이의 난수를 다시 (double)RAND_MAX로 형변환된 실수로

로 나눔으로써 0~1 사이의 실수 난수를 생성.

 

Example : lotto 번호 생성

'API 및 라이브러리 > C 라이브러리 함수' 카테고리의 다른 글

sleep(3)  (0) 2011.02.12
strdup(3)  (0) 2010.09.14
strstr(3)  (1) 2010.09.11
system(3)  (0) 2009.12.19
getusershell(3)  (0) 2009.12.19
Posted by devanix
2011. 10. 7. 21:20

 

ASCII 코드는 미국에서 표준화한 데이터 처리 및 통신시스템 상호간의 정보교환용 표준 부호체계를 의미한다.

이 당시 문자(Character)를 표현 하는데 7bit를 1byte로 사용하였고,

이후 메모리의 구조가 변화됨에 따라 8bit를 1byte로 구성하게 되었다.

 

ASCII 코드는 모두 256(개의 부호를 두 개의 집합, 즉 표준 집합(standard set)과 확장 집합(extended set)으로 구분.

표준 집합 : 십진수 0~127(16진수 0x00~0x7f)가지 128개 문자 부호 제공.

(제어문자, 알파벳 대문자와 소문자, '0'~'9'까지의 숫자 그리고 일반적으로 사용되는 특수 기호로 구성)

확장 집합 : 십진수 128~255(16진수 0x80~0xff)가지 128개 문자 부호를 추가로 제공.

(컴퓨터 업체나 프로그래머로 하여금 여러 다양한 문자를 할당하여 사용할 수 있도록 하였기 때문에 일반적으로

통용되는 코드 집합이 아니며 컴퓨터 제조 회사나 국가별로 차이가 있다)

 

제어 문자(control characters) : 0부터 ~ 31까지(16진수로 0x00 ~ 0x1f)는

TAB, CR(Carriage Return), LE(line Feed)등의 제어 문자를 표현하기 위한 용도.

출력 가능한 문자(printable characters) : 32부터 ~ 126까지 출력으로 확인 가능한(Printable)문자들로 구성.

 

Standard ASCII Codes

 

Extended ASCII Codes

Posted by devanix
2011. 9. 23. 13:34

Vim 편집기로 스크립트 작성하기, Part 1: 변수, 값 및 표현식

Vimscript는 Vim 편집기를 변경하고 확장하기 위한 메커니즘입니다.

스크립트를 사용하면 새 도구를 작성하고 일반 작업을 단순화할 수 있을 뿐만 아니라

편집기의 기존 기능까지도 재설계하여 변경할 수 있습니다. 시리즈의 첫 번째인 이 기사에서는

Vimscript 프로그래밍 언어의 기본 구성 요소인 값, 변수, 표현식, 명령문, 함수 및 명령에 대해 설명합니다.

또한 일련의 간단한 예제를 통해 기능을 직접 구현해 보면서 설명합니다.

Vim 편집기로 스크립트 작성하기, Part 2: 사용자 정의 함수

사용자 정의 함수는 실제 환경에서 사용하고 있는 복잡한 프로그래밍 작업을 관리하기 위해 애플리케이션을

쉽게 관리할 수 있는 올바른 구성 요소로 분해하는 데 사용되는 필수 도구입니다. 시리즈의 두 번째 기사에 해당하는

이 기사에서는 몇 가지 실용적인 예제를 통해 Vimscript 언어에서 새 함수를 작성하고 전개하는 방법에 대해 설명합니다.

Vim 편집기 스크립팅, Part 3: 내장 리스트

vim스크립트는 프로그래밍의 초석인 데이터 컬렉션에 대한 연산에 있어 최상의 지원을 제공한다.

이 연재의 세 번째 기사에서는 vim스크립트의 내장 리스트를 이용하여, 리스트를 재구성하거나

연속된 파일명들을 필터링하거나 행 번호의 집합을 정렬하는 것과 같은 매일 하는 연산들을 손쉽게 하는

방법을 배울 것이다. 독자들은 또한 vim의 두 가지 일반적인 사용, 즉 할당 연산자를 정렬하는 사용자 정의 함수를

만들고, 내장 텍스트 완성 기능을 향상시키는 부분에서 리스트의 위력을 확대하고 강화하는 예들을 접할 것이다.

Vim 편집기로 스크립트 작성하기, Part 4: 사전

사전은 목록에서 다양한 최적화 기능과 상충 관계를 제공하는 컨테이너 데이터 구조입니다.

특히, 사전에서는 요소의 저장 순서가 중요하지 않으며 각 요소의 ID가 명시적입니다. Vimscript를

소개하는 이 시리즈의 네 번째 기사에서는 사전을 소개하면서 사전의 기본 구문에 대한 개요와 여러 기능에

대해 설명합니다. 마지막으로 여러 예제를 통해 사전을 사용하여 효과적으로 데이터를 처리하고 정돈된 코드를

작성하는 방법을 보여 줍니다.

Vim 편집기로 스크립트 작성하기, Part 5: 이벤트 구동 스크립트 및 자동화

왜 직접 반복하고 있습니까? Vim의 종합적인 이벤트 모델을 구성하면 파일을 로드하거나 편집기 모드 간에

전환하는 등의 특정 편집 이벤트가 발생할 때마다 시간을 절약할 수 있는 스크립트를 실행할 수 있습니다.

이 시리즈의 다섯 번째 기사인 이 기사에서는 Vim에서 이벤트가 작동하는 방법을 설명하고 유용한 이벤트 유형을

살펴본 다음 특정 스크립트를 특정 이벤트에 연결합니다. 결과적으로 사용자의 요구에 맞게 구성된 자동화된

워크플로우를 얻을 수 있습니다.

 

'Essential Tools > VIM - Vi IMproved' 카테고리의 다른 글

[VIM Plugin] T-Commant  (0) 2011.09.22
[VIM Plugin] snipMate  (0) 2011.09.22
[VIM] 단축키 정리  (0) 2011.06.27
[VIMRC] Personal Vim Initializations (개인 환경 설정)  (0) 2009.12.20
Posted by devanix
2011. 9. 23. 13:33

Vim 편집기로 스크립트 작성하기, Part 1: 변수, 값 및 표현식

Vimscript는 Vim 편집기를 변경하고 확장하기 위한 메커니즘입니다.

스크립트를 사용하면 새 도구를 작성하고 일반 작업을 단순화할 수 있을 뿐만 아니라

편집기의 기존 기능까지도 재설계하여 변경할 수 있습니다. 시리즈의 첫 번째인 이 기사에서는

Vimscript 프로그래밍 언어의 기본 구성 요소인 값, 변수, 표현식, 명령문, 함수 및 명령에 대해 설명합니다.

또한 일련의 간단한 예제를 통해 기능을 직접 구현해 보면서 설명합니다.

Vim 편집기로 스크립트 작성하기, Part 2: 사용자 정의 함수

사용자 정의 함수는 실제 환경에서 사용하고 있는 복잡한 프로그래밍 작업을 관리하기 위해 애플리케이션을

쉽게 관리할 수 있는 올바른 구성 요소로 분해하는 데 사용되는 필수 도구입니다. 시리즈의 두 번째 기사에 해당하는

이 기사에서는 몇 가지 실용적인 예제를 통해 Vimscript 언어에서 새 함수를 작성하고 전개하는 방법에 대해 설명합니다.

Vim 편집기 스크립팅, Part 3: 내장 리스트

vim스크립트는 프로그래밍의 초석인 데이터 컬렉션에 대한 연산에 있어 최상의 지원을 제공한다.

이 연재의 세 번째 기사에서는 vim스크립트의 내장 리스트를 이용하여, 리스트를 재구성하거나

연속된 파일명들을 필터링하거나 행 번호의 집합을 정렬하는 것과 같은 매일 하는 연산들을 손쉽게 하는

방법을 배울 것이다. 독자들은 또한 vim의 두 가지 일반적인 사용, 즉 할당 연산자를 정렬하는 사용자 정의 함수를

만들고, 내장 텍스트 완성 기능을 향상시키는 부분에서 리스트의 위력을 확대하고 강화하는 예들을 접할 것이다.

Vim 편집기로 스크립트 작성하기, Part 4: 사전

사전은 목록에서 다양한 최적화 기능과 상충 관계를 제공하는 컨테이너 데이터 구조입니다.

특히, 사전에서는 요소의 저장 순서가 중요하지 않으며 각 요소의 ID가 명시적입니다. Vimscript를 소개하는

이 시리즈의 네 번째 기사에서는 사전을 소개하면서 사전의 기본 구문에 대한 개요와 여러 기능에 대해 설명합니다.

마지막으로 여러 예제를 통해 사전을 사용하여 효과적으로 데이터를 처리하고 정돈된 코드를 작성하는 방법을 보여 줍니다.

Vim 편집기로 스크립트 작성하기, Part 5: 이벤트 구동 스크립트 및 자동화

왜 직접 반복하고 있습니까? Vim의 종합적인 이벤트 모델을 구성하면 파일을 로드하거나 편집기 모드 간에

전환하는 등의 특정 편집 이벤트가 발생할 때마다 시간을 절약할 수 있는 스크립트를 실행할 수 있습니다.

이 시리즈의 다섯 번째 기사인 이 기사에서는 Vim에서 이벤트가 작동하는 방법을 설명하고 유용한 이벤트 유형을

살펴본 다음 특정 스크립트를 특정 이벤트에 연결합니다. 결과적으로 사용자의 요구에 맞게 구성된 자동화된

워크플로우를 얻을 수 있습니다.

 

Posted by devanix
2011. 9. 22. 22:27


토글형식의 주석을 자동으로 달아주는 플러그인 입니다.
여러 파일형식을 지원(html, python, sh, c... 등등)

저같은 경우는 그냥 'Ctrl+//' 만 주로 사용하므로 자세한 내용은 해당 사이트 및 문서 참조.

http://www.vim.org/scripts/script.php?script_id=1173
Posted by devanix
2011. 9. 22. 21:26


자주 사용하는 코드 조각을 트리거 단어<tab>을 사용하여 코드를 자동 완성 시켜준다.
snippets 디렉토리에 확장자 별로 기본 정의가 되어있고 입맛대로 추가 하여 사용할수 있다.

특별히 플러그인을 추가하여 셋팅할것은 많치 않다.
.vimrc 추가 :
        filetype plugin on
        "set paste 주석처리

set paste 설정이 되어있으면 작동하지 않을 수 있으므로 주석처리를 한다.(VIM - Vi IMproved 7.3 버전을 사용)


http://www.vim.org/scripts/script.php?script_id=2540
g
ithub : http://github.com/msanders/snipmate.vim 
 
Posted by devanix
2011. 9. 14. 17:38

[ 051 ] - 구조체 변수를 만들면 반드시 초기화하자.

구조체 변수를 만들면 그 변수가 포인터이든지 아니면 구조체 변수이든지 상관없이 반드시 초기화를 해주어야 합니다.

특히 고수들은 초기화 작업을 위해 구조체를 만들고 초기화하는 별도의 함수를 사용합니다.

이 장의 본문에서 예로 든 생성 및 초기화 함수의 코드를 실무에서 구조체를 사용하는

프로그램을 작성할 때 적용할 수 있도록 충분히 연습하세요.

 

[ 052 ] - 구조체 내부에서 포인터를 사용하면 내부 항목도 메모리를 할당해 주자.

구조체를 사용할 때 내부 항목으로 char *형을 사용하는 경우가 가끔 있습니다.

반드시 char *형이 아니더라도 포인터형을 내부 항목으로 사용하는 경우가 있죠.

이와 같은 경우에는 구조체의 내부 항목도 메모리 할당을 해주어야 합니다.

만약 내부 항목이 포인터임에도 메모리 할당을 하지 않으면 프로그램을

실행하는 중에 이 포인터를 사용할 때 오류가 생길 수 있습니다.

 

[ 053 ] - 구조체 포인터를 해제할 때는 철저하게 하자.

구조체 포인터로 할당받은 변수를 사용하고 나서 해제할 때는 반드시 해제하는 순서를 지켜야 합니다.

해제하는 순서는 구조체 내부 항목으로 할당받은 메모리 영역부터 해제한 후에 그 작업이 모두 끝나면 실제

구조체 포인터도 해제해 주는 것입니다. 특히 구조체 포인터의 메모리를 해제했다고 해서 해야 할 일이 모두

끝난 것이 아니라 반드시 구조체 포인터 자체를 NULL로 초기화해야 합니다. 구조체 포인터도 또한

포인터이기 때문에 NULL로 초기화하지 않고 사용하면 치명적인 메모리 에러가 일어날 수 있습니다.

 

[ 054 ] - 구조체 배열을 잘 사용하면 데이터베이스가 부럽지 않다.

데이터베이스는 수많은 데이터를 특별한 규칙으로 분류하여 체계적으로 저장해 놓고

사용자가 원할 때마다 꺼내어 빠르게 출력하는 것입니다. 이 장에서 다룬 구조체 배열을 사용하면

데이터베이스와 똑같은 기능을 낼 수는 없지만 이와 비슷한 기능을 흉내 낼 수는 있습니다.

물론 구조체 포인터를 이용해서 같은 기능의 작업을 할 수도 있지만 인덱스로 직접 메모리를 접근할 수 있다는

배열의 장점과 여러 가지 자료형을 하나로 묶는다는 구조체의 장점을 모두 살릴 수 있는 방법은

구조체 배열이 유일하기 때문에 익혀 두면 여러모로 유용합니다.

 

[ 055 ] - 구조체 안에 구조체를 선언하자.

구조체 안에 구조체를 선언하는 방법은 객체 지향 프로그래밍의 상속(Inheritance)과 비슷합니다.

객체 지향에서 상속은 부모 클래스에서 선언한 멤버 변수나 멤버 함수를 상속받아서 자식 클래스에서

그대로 사용할 수 있는 것입니다. 구조체 안의 구조체는 하나의 구조체 안에서 기존의 구조체를

하나의 항목으로 선언할 수 있습니다.

따라서 구조체 안의 구초제는 마치 레고 블록으로 건물을 짓듯이 기존의 구조체로 선언한 자료형을

사용하여 손쉽게 새로운 자료형을 만들 수 있다는 장점이 있습니다.

 

[ 056 ] - 배열과 구조체 포인터를 연결해 사용하는 고수들의 개발 노하우를 배우자.

본문에서 다룬 배열과 구조체 포인터를 연결하는 방법은 일반적으로 많이 알려진 방법은 아니지만

문자형 배열과 구조체 포인터를 연결하면 메로리를 공유할 수 있다는 장점이 있습니다.

다음 장의 공용체를 사용하는 부분에서도 다루지만 배열과 구조체 포인터를 연결하는 방법은

공용체를 사용하는 방법보다 훨씬 강력한 기능을 하는 기술입니다.

한 번에 잘 이해가 안 되면 몇 번이고 배운 내용을 반복하면서 완전하게 자기 것으로 만들기 바랍니다.

 

[ 057 ] - 공용체를 사용하자.

공용체를 구조체와 혼동하면 절대 안 됩니다. 구조체는 여러가지 자료형을 그룹으로 묶는 역할을 하는 반면,

공용체는 하나의 메모리 공간을 여러 가지 자료형이 공동으로 사용하는 역할을 합니다.

따라서 공용체를 사용하면 하나의 메모리 공간을 두 개 이상의 자료형이 공유할 수 있기 때문에

하나의 데이터를 여러 가지 자료형에 맞게 사용할 수 있는 장점이 있습니다.

 

[ 058 ] - 공용체와 구조체를 함께 사용하자.

공용체와 구조체를 함께 사용하는 방법은 임베디드 프로그래밍 분야에서는 기본적인 노하우입니다.

특히 구조체를 사용하여 비트 단위로 각 항목을 설정하고 공용체로 바이트 단위로 접근하면

비트 처리와 바이트 처리를 모두 할 수 있기 때문에 임베디드처럼 비트 처리와 바이트 처리가

모두 필요한 프로그래밍 분야에서 필수라고 할 수 있습니다.

 

[ 059 ] - 고수들이 사용하는 전처리기의 기능을 알아 두자.

전처리기는 컴파일 과정 전에 일부 과정을 처리하기 위해서 실행되는 일종의 애벌빨래와 같은 기능입니다.

전처리 과정에서 처리하는 내용은 다음과 같습니다.

 

① #define

필요한 표현을 미리 정의해 둘 수 있습니다.

② #pragma

하나의 헤더 파일을 여러 소스 파일에서 사용하는 경우에 일어날 수 있는 중복으로 인한 링크 오류를 막습니다.

③ #ifdef(또는 #ifndef) ~ #else ~ #endif

컴파일과 실행되는 코드들을 그룹으로 나눌 수 있습니다. 주로 디버깅용과 릴리스용으로 나눌 때 사용합니다.

④ 매크로 함수

작은 연산을 하는 경우라면 일반 함수 대신 #define 문을 사용하여 매크로 함수를 만들 수 있습니다.

 

[ 060 ] - Make를 알아 두자.

Make는 흔히 리눅스나 유닉스에서만 사용하는 도구로 알고 있는데,

유닉스나 리눅스에서 Make 도구를 자주 사용하는 것은 맞지만

그렇다고 윈도우 프로그램에서 사용하지 못하는 것은 아닙니다.

단지 윈도우 프로그래밍을 할 때는 비주얼 C++나 비주얼 베이직이라는 통합 개발 환경에서

전용으로 사용하는 도구가 있기 때문에 굳이 Make 도구를 사용할 필요가 없는 것이죠.

비주얼 C++의 전신인 마이크로소프트 C 7.0만 하더라도 Make 도구를 사용했습니다.

리눅스나 유닉스 프로그래밍을 하려면 반드시 Make 도구와 Makefile을 작성하는 방법을 알고 있어야 합니다.

 

[ 061 ] 디버깅을 잘하는 사람이 진짜 고수다.

아무리 프로그래밍 실력이 좋은 개발자라고 해도 프로그래밍을 하면서 디버깅을 하지 않는 경우는 없습니다.

처음 프로그램을 설계할 때부터 완벽하게 설계하고 프로그래밍을 하는 사람일지라도 결국 오류가 생기게 마련입니다.

어떤 언어이든지 상관없이 디버깅을 얼마나 효율적으로 빨리 할 수 있느냐는

개발자가 어느 정도 레벨의 프로그래머인지 판단하는 데 중요한 요소입니다.

지금까지 이 책에서 다룬 수많은 프로그래밍 노하우 가운데 최고는 디버깅입니다.

디버깅을 잘하는 사람이야말로 최고의 고수라고 할 수 있기 때문에 효율적으로

디버깅을 할 수 있도록 꾸준하게 연습하기 바랍니다.

Posted by devanix