콘텐츠로 건너뛰기
Home » C/C++

C/C++

[C] 프로그램 파라미터를 처리하는 getopt() 사용법

C프로그램의 파라미터 파싱 및 처리 문자열 파싱은 스크래치 상태(아무것도 없는 빈 상태)로부터 구현하기가 만만치 않은데, 이를 도와주는 라이브러리 함수가 있으니 바로 unistd.h에 정의된 getopt() 함수이다. getopt() 이 함수의 원형은 다음과 같다. int getopt(int argc, char * const argv[], const char *optstring); 이 함수의 파라미터는 간단한다. argc, argv : main() 함수가 받은 파라미터를 그대로 전달한다. optstring : 파싱해야 할 파라미터를 쓴다. 옵션이 별도의 파라미터를 받는 경우 콜론을 함께 쓴다. 예를 들어 -h, -v, -f filename을 받는 세 가지 옵션이 있다고 하면… 더 보기 »[C] 프로그램 파라미터를 처리하는 getopt() 사용법

[C] 동적으로 할당한 메모리 영역의 크기를 나중에 알 수 있게 하기

동적으로 할당받은 메모리의 크기를 구하기

sizeof 함수는 (정확히는 매크로 함수) 타입의 크기를 반환한다. 배열 이름은 배열의 시작번지를 나타내므로 포인터와 거의 동일하게 취급되고, 또 많은 서적에서 이 둘을 같은 것이라고 말하는데, 사실은 다르다. sizeof() 함수는 배열을 인자로 넣으면 배열의 크기를 알려준다. 따라서 배열의 요소의 개수는 sizeof(intArr) / sizeof(int)와 같은 식으로 구할 수 있다.
이와 반대로 동적으로 메모리를 할당받는 malloc 류의 함수는 포인터를 반환한다. 포인터는 unsigned long int형으로 시스템에 따라 4혹은 8바이트의 크기가 된다. 따라서 배열을 동적으로 할당하기 위해 메모리 할당 함수를 사용하면 sizeof(포인터이름)은 포인터의 크기를 반환하므로 배열의 요소의 개수를 알아낼 수가 없다.
사실 이미 메모리를 할당하는 시점에, 크기를 지정해 주었으므로 그 영역의 크기는 알고 있는 상황이지만 이 값을 변수에 담아서 계속 들고다니기란 조금 귀찮다. 여기서는 배열을 할당할 시에 그 크기를 나중에 알 수 있도록 하는 꼼수를 소개한다.더 보기 »[C] 동적으로 할당한 메모리 영역의 크기를 나중에 알 수 있게 하기

[c/c++] SMI를 SRT로 컨버팅하기

Handbrake같은 인코딩 도구를 사용하여 동영상을 인코딩할 때 자막을 영상에 포함하는 옵션이 있는데, 이 때 사용할 수 있는 자막 포맷은 .SRT 형식이다. 국내에서 유통되는 대부분의 자막 포맷은 .SMI 파일이라서, 이를 SRT로 컨버팅할 수 있는 도구가 있으면 좋다. 예전에 맥에서 사용하려고 뒤져봤던 코드가 있었는데, (해당 코드는 다음 페이지에 있다.) 하도 오래전이라 조금 보기 편하게 하려고 수정을 했는데…. 생각보다 너무 오래전 스타일로 작성되어 있더라.(원 글이 작성된 11년 전 기준으로도 되게 오래된 코드였음) C로 새로 구현한 버전도 있긴 한데, 이렇게 공개해봤자 사실 쓰려는 사람도… 더 보기 »[c/c++] SMI를 SRT로 컨버팅하기

페이지 1 2

[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (2/2)

지난 글에서는 구조체로 정의한 임의의 정보들을 디스크에 기록하는 방법을 예시를 통해 살펴보았다. 그런데 해당 글의 예제는 실제 기록하고 읽어들일 때 사용하는 함수(fread(), fwrite())의 사용법에 초점을 맞추었던 관계로 모든 정보가 구조체 내부에 들어있는 상황을 가정했다. 모든 정보가 구조체 속에 들어있는 상황은 구조체 멤버 중에 포인터가 없는 상황을 말한다. 모든 멤버의 정보는 구조체의 영역 내부에 존재하므로 구조체가 점유하고 있는 메모리 공간은 연속적이다. 따라서 이 경우 해당 구조체의 데이터를 메모리의 다른 어딘가로 복사할 수도 있고, 똑같은 방식으로 파일로 복사할 수도 있다. 바이트를 파일에… 더 보기 »[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (2/2)

[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (1/2)

텍스트가 아닌 애플리케이션의 고유한 데이터를 파일에 기록하는 방법에 대해서 알아보자. 애플리케이션 내에서 정의한 어떤 정보는 다양한 형태와 구조를 가질 수 있기 때문에, 평문 텍스트를 저장하는 것과는 다르다. 이 글에서는 간단한 데이터 타입을 구조체를 통해 정의해보고, 이렇게 만들어진 데이터를 어떻게 디스크에 저장하고 또 다시 불러올 수 있는지에 대해서 알아볼 것이다.

더 보기 »[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (1/2)

[C/C++] 가변인수를 받는 함수

C함수의 가변인수 C함수도 가변인수를 사용할 수 있다. 대표적인 예가 printf이다. printf에는 서식 문자열을 비롯하여 서식에 채워질 값들을 컴마로 연결하여 나열할 수 있다. 이러한 가변인수는 어떻게 만들어서 사용할 수 있는지 살펴보자. 가변인수 함수의 선언 가변 인수 함수는 가변적으로 받을 인수 대신 …을 사용하는 것으로 가변 인수 함수임을 컴파일러에게 알릴 수 있다. 인수에 …이 들어있는 경우 컴파일러는 인수의 개수나 타입에 대해서는 전혀 신경을 쓰지 않게 된다. (결국 이는 함수 구현 시 프로그래머가 일일이 체크해야 하는 부분이다.) 이 때 중요한 것은 고정적으로 사용하는 인수는… 더 보기 »[C/C++] 가변인수를 받는 함수