wcspbrk() 함수는 C 및 C++의 표준 라이브러리에 내장된 함수로, 하나의 와이드 문자열(wide string) 안에서 다른 와이드 문자열에 포함된 문자 집합을 검색하는 데 사용됩니다. 이 함수는 <cwchar> 헤더 파일에 선언되어 있습니다. wcspbrk() 함수의 매개변수 이 함수는 두 개의 인수를 받습니다. dest (첫 번째 인수): 검색 대상이 되는 널 종료(null-terminated) 와이드 문자열입니다. src (두 번째 인수): 검색할 문자들을 담고 있는 널 종료 와이드 문자열입니다. 반환값
C나 C++ 프로그래밍에서 가장 자주 접하는 질문 중 하나는 바로 초기화되지 않은 기본(primitive) 데이터 타입의 값은 과연 무엇일까?라는 것입니다.많은 초보 개발자들은 컴파일러가 정수형에는 0, 실수형에는 0.0처럼 적절한 기본값을 자동으로 할당해 줄 것이라고 생각합니다. 하지만 실제 답은 사용하는 운영체제와 컴파일러 환경에 따라 달라집니다. 특히 문자형(char) 데이터의 경우 어떤 값이 들어 있을지 예측하기 더욱 어렵습니다.예제 코드다음 코드는 초기화하지 않은 여러 기본 데이터 타입 변수를 선언한 뒤 그 값을 그대로 출
이 글에서는 시스템에서 C 프로그램이 어떻게 실행되는지 살펴봅니다. 이는 곧 C 프로그램의 컴파일 과정이라고 할 수 있습니다.다음 다이어그램은 C 소스 코드가 실행 파일로 변환되는 전체 흐름을 보여줍니다.위 다이어그램의 각 단계를 자세히 알아보겠습니다.1. 소스 코드(C 코드)개발자가 직접 작성한 코드입니다. 작성된 코드는 가장 먼저 전처리기(Preprocessor) 단계로 전달됩니다.2. 전처리(Preprocessing)전처리 단계에서는 전처리기 파일들이 작성한 코드에 결합됩니다. 우리는 stdio.h, math.h 같은 헤더 파
이 글에서는 C 또는 C++ 프로그램의 소스 코드에서 전처리기(preprocessor)가 처리한 결과 코드, 즉 전처리된 코드를 생성하는 방법을 알아보겠습니다.g++ 컴파일러로 전처리된 코드를 확인하려면 -E 옵션을 함께 사용하면 됩니다. 이 옵션은 컴파일 과정 중 전처리 단계까지만 수행하고 그 결과를 화면에 출력합니다.전처리기는 코드에 포함된 모든 # 디렉티브(#include, #define 등)를 처리하며, 정의된 매크로(MACRO)도 실제 값으로 확장합니다.문법g++ -E program.cpp예제#define PI 3.1415
C나 C++에서 전위 증가(pre-increment)와 후위 증가(post-increment)는 모두 값을 1씩 늘리는 증가 연산자입니다. 하지만 두 연산자는 동작 방식에서 중요한 차이를 보이기 때문에, 이를 정확히 이해하는 것은 C/C++ 프로그래밍의 기본기 중 하나입니다.전위 증가와 후위 증가의 동작 원리전위 증가 연산자(++변수)는 변수의 값을 먼저 1 증가시킨 후, 그 결과를 다른 변수에 대입합니다. 반면 후위 증가 연산자(변수++)는 현재 값을 먼저 다른 변수에 대입한 뒤에야 원래 변수의 값을 1 증가시킵니다.즉, 대입 시
C 프로그래밍에서는 정수(int)와 문자(char) 변수를 프로그램 곳곳에서 매우 자주 사용합니다. 그렇다면 이 값들은 실제로 메모리에 어떤 형태로 저장될까요? 이번 글에서는 그 내부 동작 원리를 예제와 함께 자세히 살펴보겠습니다.문자 값도 결국 정수다C 언어에서 문자(char) 값은 내부적으로 정수 형태로 저장됩니다. char 타입은 1바이트(8비트) 크기를 가지므로, 저장하려는 값이 이 범위를 벗어나면 상위 비트가 잘려나가고 의도와 다른 값이 저장될 수 있습니다.char 변수에 270 대입하기다음 코드처럼 char 타입 변수에
C 언어에서는 코드에서 변수를 사용하기 전에 반드시 선언해야 한다는 것을 잘 알고 있습니다. 그런데 흥미롭게도 일부 변수는 별도의 초기화 없이도 자동으로 0 또는 1의 값을 갖게 됩니다. 이번 글에서는 이러한 암시적 초기화(implicit initialization)가 어떤 경우에 발생하는지 예제를 통해 살펴보겠습니다.전역 변수와 매개변수의 암시적 초기화아래 예제는 전역 변수와 main 함수의 첫 번째 매개변수가 어떻게 자동으로 초기화되는지 보여줍니다.#include <stdio.h> #include <stdlib.
함수에도 메모리 주소가 있다C 또는 C++에서 변수는 메모리에 저장되기 때문에 해당 메모리 주소를 확인할 수 있습니다. 마찬가지로 함수 역시 컴파일된 후 메모리에 저장되므로 고유한 주소를 가집니다.함수의 주소를 얻는 방법은 매우 간단합니다. 괄호(()) 없이 함수 이름만 사용하면 됩니다. 함수 이름은 곧 함수 코드가 시작되는 메모리 위치를 가리키는 포인터 역할을 하며, 이를 함수 포인터(function pointer)라고 부릅니다. 함수 포인터는 콜백 함수 구현이나 동적 함수 호출 등 다양한 상황에서 유용하게 활용됩니다.예제 코드아
C와 C++에서 문자형 데이터는 내부적으로 ASCII 값으로 저장됩니다. 따라서 단일 문자를 정수 형태로 출력하면 해당 문자의 ASCII 값이 그대로 표시됩니다. 하지만 작은따옴표 안에 두 개 이상의 문자를 넣어 출력하려고 하면 다소 생소한 숫자가 출력됩니다.다음 예제 프로그램을 통해 그 원리를 확인해 보겠습니다.예제 코드#include <stdio.h> int main() { printf("%d\n", 'A'); printf("%d\
C 언어의 mbtowc() 함수란?C 표준 라이브러리 함수 int mbtowc(wchar_t *pwc, const char *str, size_t n)는 멀티바이트(multibyte) 문자 시퀀스를 하나의 와이드 문자(wide character)로 변환하는 함수입니다. 이 함수는 <stdlib.h> 헤더 파일에 선언되어 있으며, UTF-8과 같은 다국어 인코딩을 처리할 때 유용하게 사용됩니다.함수 원형int mbtowc(wchar_t *pwc, const char *str, size_t n)매개변수 설명pwc &minus
개요프로그래밍을 하다 보면 매개변수 개수가 고정되어 있지 않고, 호출할 때마다 전달하는 인자의 개수가 달라지는 함수가 필요한 경우가 있습니다. C/C++ 언어는 이러한 상황을 위해 해결책을 제공하며, 필요에 따라 가변 개수의 매개변수를 받을 수 있는 함수를 정의할 수 있습니다.다음은 그러한 함수를 정의하는 기본 형태입니다.int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }가변 인자 함수의 규칙주목해야 할 점은
이 글에서는 부동 소수점(floating point) 숫자를 반올림할 수 있는 한 줄짜리 C 함수를 작성하는 방법을 알아보겠습니다. 별도의 조건문 없이 삼항 연산자만으로 간결하게 구현할 수 있습니다.반올림의 기본 원리C 표준 라이브러리에는 round() 함수가 존재하지만, 직접 구현해야 하는 상황이라면 다음과 같은 간단한 수학적 원리를 활용할 수 있습니다.반올림할 숫자를 입력받습니다.숫자가 양수라면 0.5를 더합니다.숫자가 음수라면 0.5를 뺍니다.형 변환(typecasting)을 사용하여 부동 소수점 값을 정수로 변환합니다.정수형
이번 글에서는 main() 함수에서 printf() 함수의 출력 결과를 변경하는 방법을 알아보겠습니다. 핵심 아이디어는 특정 함수를 정의하여, 그 함수가 호출된 이후부터 모든 printf() 문이 지정된 값으로 출력되도록 만드는 것입니다.#define 매크로를 활용한 구현 원리이 작업에는 전처리기 지시문인 #define 매크로를 사용합니다. 매크로를 함수 내부에 정의하면, 해당 함수가 호출될 때 비로소 매크로가 적용되기 때문에 main 함수에서 호출 시점을 제어할 수 있습니다.만약 #define 줄을 함수 밖에 그대로 작성하면 프로
C에서 함수 실행 시간 측정하기프로그램이나 특정 프로세스가 실행되는 데 걸리는 시간을 계산해야 하는 경우가 자주 있습니다. C 언어에서는 clock() 함수를 사용하여 이를 간단하게 측정할 수 있습니다. clock() 함수는 표준 헤더 파일인 time.h에 정의되어 있으며, 프로그램 시작 이후 경과된 프로세서 시간(클록 틱 수)을 반환합니다.경과 시간을 구하는 원리는 다음과 같습니다. 작업을 수행하기 직전에 clock()으로 시작 시점의 값을 저장하고, 작업이 끝난 후 다시 clock()을 호출하여 두 값의 차이를 구합니다. 그다음
C의 setjmp()와 longjmp()란?이번 글에서는 C 언어의 setjmp()와 longjmp() 함수에 대해 자세히 알아보겠습니다. 두 함수는 비지역 점프(non-local jump)를 수행하는 저수준 제어 흐름 도구로, 모두 setjmp.h 헤더 파일에 정의되어 있습니다. 기본 문법은 다음과 같습니다.setjmp(jmp_buf buf) : 현재 실행 위치를 buf에 저장하고, 처음 호출 시 0을 반환한다.longjmp(jmp_buf buf, i) : buf가 가리키는 위치로 되돌아가며, 해당 지점에서 i를 반환값으로 전달한
C 언어에는 부동소수점 값에서 소수점 이하를 버리고 정수 부분만 남기는 절삭(truncation) 함수가 세 가지 있습니다. 바로 trunc(), truncf(), truncl()입니다. 이 세 함수는 처리하는 자료형만 다를 뿐 동작 방식은 동일하며, 모두 math.h 헤더 파일에 선언되어 있으므로 사용 전에 반드시 포함해야 합니다(C99 표준에서 도입).trunc() 함수trunc() 함수는 double형 인수를 받아 소수점 이하를 버리고 정수 부분만 반환합니다. 단순히 소수 자릿수를 잘라내기 때문에 반올림과 달리 음수라면 0 방
C 언어에서 두 개의 부동소수점(float 또는 double) 숫자에 대한 모듈로, 즉 나머지를 구하는 방법을 알아보겠습니다. 모듈로는 기본적으로 나눗셈의 나머지를 구하는 연산입니다. C에서는 math.h 헤더에 포함된 remainder() 함수를 사용하여 부동소수점 숫자의 나머지를 손쉽게 계산할 수 있습니다. remainder() 함수는 분자를 분모로 나눈 부동소수점 나머지를 반환하며, 수식으로 표현하면 다음과 같습니다. remainder(x, y) = x – rquote * y 여기서 rquote는 x/y의 값으로, 가장 가까운
이 글에서는 C 언어를 사용해 로컬 시스템의 호스트 이름(Host Name)과 IP 주소를 간단하게 조회하는 방법을 알아봅니다. 몇 가지 표준 네트워크 함수만 활용하면 누구나 쉽게 구현할 수 있습니다.주요 함수 소개프로그램에서 사용되는 핵심 함수들은 각각 다음과 같은 역할을 담당합니다.함수설명gethostname()로컬 컴퓨터의 표준 호스트 이름을 가져옵니다.gethostbyname()호스트 데이터베이스에서 호스트 이름에 해당하는 호스트 정보를 찾습니다.inet_ntoa()IPv4 인터넷 네트워크 주소를 점으로 구분된 십진수(dot
이번 글에서는 C언어에서 숫자를 100번 출력하는 방법을 알아보겠습니다. 단, 몇 가지 제약 조건이 있습니다. 반복문(loop), 재귀 함수(recursion), 매크로 확장(macro expansion)을 사용할 수 없습니다.setjmp와 longjmp를 활용한 해결 방법이 문제를 해결하기 위해 C언어의 setjmp()과 longjmp() 함수를 활용할 수 있습니다. 이 두 함수는 setjmp.h 헤더 파일에 정의되어 있으며, 프로그램 실행 흐름을 특정 지점으로 되돌아가게 하는 비지역 점프(non-local jump) 기능을 제공
이 글에서는 C 또는 C++에서 정수형 배열(int array)의 크기를 구하는 방법을 알아보겠습니다. 여기서 말하는 배열의 크기란 해당 배열에 들어 있는 요소(element)의 개수를 의미합니다.sizeof() 연산자를 활용한 배열 크기 계산배열의 크기를 구하는 가장 일반적인 방법은 sizeof() 연산자를 사용하는 것입니다. sizeof()에 배열 이름을 전달하면, 그 배열이 차지하고 있는 메모리 블록의 전체 크기(바이트 단위)가 반환됩니다.따라서 배열 전체 크기를 배열 요소 하나의 크기로 나누면, 배열에 포함된 요소의 개수를