Media Log

<?php
/**
* PHP implementation of the PvPGN Password Hash Algorithm.
* Copyright 2004 Aaron (aaron@pvpgn.org)
* This code is available under the GNU Lesser General Public License:
* http://www.gnu.org/licenses/lgpl.txt
* This code in general is based on:
* Copyright 2002 - 2003 Marcus Campbell
* http://www.tecknik.net/sha-1/
* Based on the JavaScript SHA-1 implementation by Paul Johnston
* http://pajhome.org.uk/
* the safe_rol function is taken from an PHP SHA-1 implementation
* written by Chris Monson (chris@bouncingchairs.net)
* Most recent version available on http://bouncingchairs.net
* (Based on the SHA algorithm as given in "Applied Cryptography")
*/
function str2blks_pvpgn($str) {
    $nblk = ((strlen($str) + 8) >> 6) + 1;
    for($i = 0; $i < $nblk * 16; $i++) {
        $blks[$i] = 0;
    }
    for($i = 0; $i < strlen($str); $i++) {
        $blks[$i >> 2] |= ord(substr($str,$i,1)) << (($i % 4) * 8);
    }
    return $blks;
}

function safe_add($x,$y) {
    $lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
    $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
    return ($msw << 16) | ($lsw & 0xFFFF);
}

function safe_not($num) {
    $lsw = (~($num & 0xFFFF)) & 0xFFFF;
    $msw = (~($num >> 16)) & 0xFFFF;
    return ($msw << 16) | $lsw;
}

function safe_rol($num,$amt) {
    $leftmask = 0xffff | (0xffff << 16);
    $leftmask <<= 32 - $amt;
    $rightmask = 0xffff | (0xffff << 16);
    $rightmask <<= $amt;
    $rightmask = safe_not($rightmask);

    $remains = $num & $leftmask;
    $remains >>= 32 - $amt;
    $remains &= $rightmask;

    $res = ($num << $amt) | $remains;
    return $res;
}

function ft($t,$b,$c,$d) {
    if($t < 20) {
        return ($b & $c) | ((safe_not($b)) & $d);
    }
    if($t < 40) {
        return $d ^ $c ^ $b;
    }
    if($t < 60) {
        return ($c & $b) | ($d & $c) | ($d & $b);
    }
    return $d ^ $c ^ $b;
}

function kt($t) {
    if($t < 20) {
        return 0x5a82 << 16 | 0x7999;
    }
    elseif($t < 40) {
        return 0x6ed9 << 16 | 0xeba1;
    }
    elseif($t < 60) {
        return 0x8f1b << 16 | 0xbcdc;
    }
    else {
        return 0xca62 << 16 | 0xc1d6;
    }
}

function get_hash($str) {
    // Fix for Unicode support by Naki-BoT
    for($i = 0;$i < strlen($str);$i++) {
        // PvPGN hash is case insensitive but only for ASCII characters
        if(ord($str[$i]) < 128) {
            $str[$i] = strtolower($str[$i]);
        }
    }

    $x = str2blks_pvpgn($str);

    $a = 0x6745 << 16 | 0x2301;
    $b = 0xefcd << 16 | 0xab89;
    $c = 0x98ba << 16 | 0xdcfe;
    $d = 0x1032 << 16 | 0x5476;
    $e = 0xc3d2 << 16 | 0xe1f0;    

    for($i = 0; $i < count($x); $i += 16) {
        $olda = $a;
        $oldb = $b;
        $oldc = $c;
        $oldd = $d;
        $olde = $e;

        for($j = 0; $j < 16; $j++) {
            $w[$j] = $x[$i + $j];
        }

        for($j = 0; $j < 64; $j++) {
            $ww = $w[$j] ^ $w[$j + 8] ^ $w[$j + 2] ^ $w[$j + 13];
            $w[$j + 16] = 1 << ($ww % 32);
        }

        for($j = 0; $j < 80; $j++) {
            if($j < 20) {
                $t = safe_add(safe_add(safe_rol($a,5),
                        ft($j,$b,$c,$d)),safe_add(safe_add($e,$w[$j]),kt($j)));
            }
            else {
                $t = safe_add(safe_add(safe_rol($t,5),
                        ft($j,$b,$c,$d)),safe_add(safe_add($e,$w[$j]),kt($j)));
            }

            $e = $d;
            $d = $c;
            $c = safe_rol($b,30);
            $b = $a;
            $a = $t;
        }

        // Fix for 64-bit OS by Pada
        $a = (safe_add($t,$olda) & 0xffffffff);
        $b = (safe_add($b,$oldb) & 0xffffffff);
        $c = (safe_add($c,$oldc) & 0xffffffff);
        $d = (safe_add($d,$oldd) & 0xffffffff);
        $e = (safe_add($e,$olde) & 0xffffffff);
    }
    return sprintf("%08x%08x%08x%08x%08x",$a,$b,$c,$d,$e);
}

사용 예:

<?php
    require_once("pvpgn_hash.inc.php");

    $pass = "12345";
    $hash = pvpgn_hash($pass);

    echo $hash;
?>
저작자 표시
신고
  1. BlogIcon 유키웹 at 2012.02.08 01:27 신고 [edit/del]

    072쨩이 올려준거 요깄네 >.<

    Reply

submit
우선 PvPGN 사이트에 공개된 1.8.5 소스(모든 플랫폼)를 다운로드 받습니다.

pvpgn-1.8.5.tar.gz를 받으셨으면 이것의 압축을 풀고 폴더를 엽니다.

Win32-Projects에 들어가면 여러개의 프로젝트가 있습니다. (bncdb, bnchat, bnftp, d2cs..)
Dev C++ 기준으로, PvPGN.dev를 엽니다.

프로젝트를 열때 파싱 과정을 끝마치고 컴파일(Ctrl+F9), 컴파일 후 실행(F9) 둘중 하나를 클릭하거나 단축키를 누르시면 컴파일 과정이 진행되게 되는데, 컴파일 과정이 끝나면 bin 폴더에 PvPGN.exe이 생성됩니다.

소스를 수정하고 싶을때는 src 폴더로 들어가셔서 수정하시면 되고,
이 생성된 실행파일을 PvPGN가 설치된 경로에 덮어씌우시면 적용됩니다.
저작자 표시
신고
  1. 오류뜸 at 2013.03.26 18:25 신고 [edit/del]

    오류를 표시합니다.

    ㄷㄷ
    비쥬얼 스튜디오 2012 인데..
    ㅠㅠ

    Reply
    • BlogIcon EXYNOA at 2013.03.26 18:40 신고 [edit/del]

      1.8.5 버전은 하위 버전에서 작성되었으므로 컨버팅 될 때 오류가 발생할 수 있습니다. 왠만하면 Dev C++ 설치하셔서 프로젝트를 열어보세요.

  2. 오류뜸 at 2013.03.27 14:16 신고 [edit/del]

    네 Dev C++ 설치하니 잘됩니다. ^^ 감사합니다.

    그런데 PVPGN 아이콘 변경하는 방법이 뭔가요

    ICON01 이란 파일을
    교체했는데 아이콘이 안바뀌더라구요 ㅠㅠ

    Reply

submit



1. 프로그램 기본 구성


자, 이제 Visual Studio를 열어 새 C 프로젝트를 만들어 봅시다. (프로젝트 생성시 응용 프로그램 마법사에서 빈 프로젝트에 체크) 그다음 프로젝트가 생성되었으면, 솔루션 탐색기에서 소스 파일에 우클릭, 추가 -> 새 항목으로 새 소스 파일을 추가합니다. 그런 다음 아래와 같이 작성하여 봅시다.

#include <stdio.h>

int main()
{
	printf("Hello, world!\n");

	return 0;
}

그다음 컨트롤 키와 F5를 동시에 눌러 디버깅을 생략하고 바로 컴파일된 파일을 실행해보도록 해봅시다. 실행하면, 콘솔창이 화면에 표시되면서 화면 내에 아래와 같이 표시됩니다.


Hello, world!
계속하려면 아무 키나 누르십시오 . . .


출력된 결과물을 살펴보니, 'Hello, world!'가 출력되고 개행되어 그 다음 행에 '계속하려면 아무 키나 누르십시오 . . .'라는 글이 보이시죠? 저 위의 코드가 어떻게 해서 이러한 결과물을 만들어 냈는지 간단히 살펴보도록 하겠습니다. 우선 1행부터 살펴봅시다.

#include <stdio.h>

위의 문장을 간단히 살펴보니 stdio.h란 녀석을 포함(include)하라는 문장인것 같죠? 맞습니다. stdio.h란 파일을 포함하라는 문장입니다. 그렇다면 stdio.h는 무엇일까요? 우선 .h는 헤더(header)를 의미하는 확장자이며, stdio는 표준 입출력 라이브러리(Standard Input and Output Library)의 약자입니다. 왜 위와 같은 문장을 달아 주었냐면, stdio.h 내에 우리가 사용할 기능(function)들이 stdio.h 내에 모두 정의되어 있기 때문입니다. 우리는 그것들을 사용하기 위해 이렇게 포함(include)을 해주어야만 사용이 가능한 것입니다. 그리고 그 아래 문장을 살펴봅시다.

int main()

위의 문장에서 int는 함수의 반환형식으로써, 지금은 return 키워드의 옆에오는 데이터의 자료형이라고만 알아두도록 합시다. 그리고 main은 프로그램의 진입점(Entry Point)으로써, 메인 함수부터 프로그램이 시작됩니다. 시작점인 메인 함수를 반드시 만들어야 한다는 것을 알아두시기 바랍니다. 그리고 그 다음 문장을 살펴봅시다.

{ ... }

위의 문장은 영역을 구분짓는 녀석으로, 위의 코드에선 제일 처음의 { 부터, 마지막의 } 까지는 메인 함수만의 영역입니다. 'int main() { ... }'에서의 {와 } 사이는 메인 함수의 고유 영역임을 기억해두시기 바랍니다. 대충 이해를 하셨으면, 다음 문장으로 넘어가도록 합시다. (아직은 완벽히 이해가 되지 않더라도 걱정하실 필요는 없습니다)

printf("Hello, world!\n");

위의 문장은 결과물을 보아, 다음과 같이 유추할 수 있겠죠? Hello, world!라는 녀석을 화면에 출력(print)하는 녀석임을 알 수 있습니다. 그렇다면 \n라는 녀석은 무엇을 하는 녀석일까요? 이는 \n를 코드에서 제외하고 다시 Ctrl+F5를 눌러 무엇이 달라졌는지 비교를 해보시기 바랍니다. (\n에 대해선 아래에서 다시 다룰 예정입니다) 참고로 문장의 끝에 항상 세미콜론(;)을 사용합니다. 어디에서부터 어디까지가 한 문장인지 구분하며, 프리포맷을 지원하여 문법에만 맞다면 제대로 컴파일이 가능합니다.마지막 코드를 살펴보도록 합시다.

return 0;

위의 문장에서 return은 말그대로 무언가를 반환(return)하는 녀석입니다. 0을 누군가에게 반환하게 되는데, 이때 이 0을 반환받는 대상은 운영체제(OS)가 됩니다. 아직은 return 0;을 함수의 종료를 알리는 문장으로만 알도록 합시다. 여기까지만 이해하고, 차차 이해를 해나가도록 합시다.


2. 이스케이프 시퀀스(Escape sequence)


이번에는 \n이 어떤 기능을 하는지, 이런 것들은 무엇이 있는지, 이러한 녀석들을 무엇이라 하는지에 대해 간략히 알아보도록 하겠습니다. 우리가 보았던 \n 문자는 행을 바꾸는 개행 문자였습니다. 이런 특수한 기능을 하는 문자를 가리켜 이스케이프 시퀀스(Escape sequence)라 하며, 이스케이프 시퀀스는 아래 표에 정리를 해두었으니 직접 아래 문자들을 이용하여 예제를 직접 한번 만들어보시기 바랍니다. 


이스케이프 시퀀스

기능

\a

경고음

\b

백스페이스(backspace)

\f

폼 피드(form feed)

\n

개 행(new line)

\r

캐리지 리턴(carriage return)

\t

수평 탭

\v

수직 탭

\'

작은 따옴표 출력

\"

큰 따옴표 출력

\\

역슬래시 출력

\ooo

아스키 문자 8진수 표시

\xhhh

아스키 문자 16진수 표시


아래 예제를 한번 실행시켜 보시고, 예제가 어떠한 기능을 하는지 직접 살펴보도록 하세요.

#include <stdio.h>

int main()
{
	printf("경고음! \a\n");
	printf("백스페이스! abcdd\befg\n");
	printf("역슬래시 출력! \\\n");

	return 0;
}

결과:

경고음!
백스페이스! abcdefg
역슬래시 출력! \
계속하려면 아무 키나 누르십시오 . . .


5행: \a는 경고음을 출력합니다.

6행: \b는 뒤에 있는 문자 하나를 지웁니다.

7행: \를 화면에 출력합니다.


3. 출력 포맷(print format) - printf


이제 다시 돌아와, printf가 무엇을 하는 녀석인지 더 깊게 들어가보도록 합시다. printf 마지막의 f는 format의 약자로 출력 포맷(print format)을 의미합니다. 출력 포맷이 무엇인지 알아보기 위하여 예제를 하나 보도록 해봅시다.

#include <stdio.h>

int main()
{
	printf("내 나이는 %d살이다.\n");

	return 0;
}

결과:

내 나이는 0살이다.
계속하려면 아무 키나 누르십시오 . . .


코드를 보니 "내 나이는 %d살이다."가 출력될 줄 알았더니, 결과에서는 "내 나이는 0살이다."라고 출력이 되었습니다. 이는 왜 그런것일까요? "내 나이는 %d살이다." 에서의 %d는 서식 문자(conversion specifer)라는 것으로, 각 서식 문자마다 출력 형태를 가집니다. 우선은 아래의 표를 먼저 보도록 합시다.


서식 문자

출력 형태

%c

단일 문자

%d

부호 있는 10진 정수

%i

부호 있는 10진 정수

%f

부호 있는 10진 실수

%s

문자열

%o

부호 없는 8진 정수

%u

부호 없는 10진 정수

%x

부호 없는 16진 정수, 소문자 사용

%X

부호 없는 16진 정수, 대문자 사용

%e

e 표기법에 의한 실수

%E

E 표기법에 의한 실수

%g

값에 따라서 %f, %e 둘 중 하나를 선택

%G

값에 따라서 %f, %E 둘 중 하나를 선택

%%

% 기호 출력


위 표를 보고, "내 나이는 %d살이다."가 어떤 형태로 출력되는지 대충 감이 오시죠? %d는 부호 있는 10진 정수를 출력하기 위한 서식 문자로, 출력하기 전 %d 서식 문자와 대응하는 인수를 조립하는 과정을 먼저 거칩니다. 위 예제를 해석하자면 "저기 있는 데이터를 부호가 있는 10진수 정수형으로 출력해!" 라는 말입니다. 그런데 결과에선 0살이라고 출력되었죠? 이는 우리가 쓰인 서식문자 수와 인수의 수가 같지 않기 때문입니다. %d와 매치되는 인수가 없다는 말입니다. 예제를 조금 바꾸어 다시 컴파일 해보도록 합시다.

#include <stdio.h>

int main()
{
	printf("내 나이는 %d살이다. 나는 %d년에 태어났다.\n", 18, 1996);

	return 0;
}

결과:

내 나이는 18살이다. 나는 1996년에 태어났다.
계속하려면 아무 키나 누르십시오 . . .


이미 이해를 한 분도 계실테지만, 그렇지 않은 분들을 위하여 어떻게 이러한 결과가 출력이 되는지 설명을 해드리도록 하겠습니다. 위의 코드에서 쓰인 서식 문자는 printf의 인수와 하나의 쌍을 이루게 되는데, 첫번째 %d와 18 그리고 두번째 %d와 1996은 각각 한묶음으로 보셔야 합니다.

이렇게 서식문자와 인수의 조합을 거치고 나서 "내 나이는 18살이다. 나는 1996년에 태어났다."가 출력되는 것입니다. 이해 되셨으리라 생각하고, 포맷 코드(형변환 기호)에 대해 잠깐만 설명을 하도록 하겠습니다.


포맷 코드

기능

%8d

우측을 기준으로 8자리 출력

%-8d

좌측을 기준으로 8자리 출력

%+8d

수치 앞에 부호 출력

%08d

수치 앞에 공백을 0으로 채움

%+08d

부호 붙이고 공백을 0으로 채움

%8.3f

전체 8자리, 소수 3자리 출력

%-8.3f

좌측을 기준으로 전체 8자리, 소수 3자리 출력

%+8.3f

수치 앞에 부호 출력

%08.3f

수치 앞에 공백을 0으로 채움

%+08.3f

부호 붙이고 공백을 0으로 채움

(위의 포맷 코드는 예일 뿐이고, 굳이 8.3이라던가, 8이 아니더라도 됩니다.)


포맷 코드를 사용한 예제를 하나 살펴보도록 합시다. 아래 예제는 정수와 실수에 대하여 포맷 코드를 통해 출력 형태를 변환하여 출력한 것입니다.

#include <stdio.h>

int main()
{
	int num1 = 1234;
	float num2 = 12.34f;

	printf("%8d\n", num1);
	printf("%-8d\n", num1);
	printf("%+8d\n", num1);
	printf("%08d\n", num1);
	printf("%+08d\n", num1);
	printf("%8.1f\n", num2);
	printf("%-8.1f\n", num2);
	printf("%+8.1f\n", num2);
	printf("%08.1f\n", num2);
	printf("%+08.1f\n", num2);

	return 0;
}
결과:

    1234
1234
   +1234
00001234
+0001234
    12.3
12.3
   +12.3
000012.3
+00012.3
계속하려면 아무 키나 누르십시오 . . .


표를 보고 출력된 결과물과 비교를 해보시기 바랍니다. 포맷 코드에 따라 어떻게 출력되는지도 살펴보시고, 이것 말고도 C언어에서는 다양한 출력 양식을 제공하고 있습니다. 참고로 출력하려는 수치, 문자의 길이가 포맷코드보다 크면 포맷코드는 무시되니 참고로 알아두시기 바랍니다.
 

4. 입력 포맷(scan format) - scanf


scanf도 printf와 마찬가지로 뒤의 f가 format의 약자입니다. 앞서 만났던 printf 함수 처럼 서식 문자가 쓰이며, printf가 화면에 무언갈 출력하는 함수였다면 scanf 함수는 무언가를 입력받는 함수입니다. 사실은 scanf 함수를 제대로 이해하기 위해서는 포인터에 대한 이해가 필요합니다. 그러나 지금은 넘겨두고 아래 예제를 보며 기본적인 이해만 하도록 하겠습니다.

#include <stdio.h>

int main()
{
	int age;

	scanf("%d", &age);
	printf("나의 나이는 %d살 입니다.", age);

	return 0;
}

결과:

18
나의 나이는 18살 입니다.
계속하려면 아무 키나 누르십시오 . . .


차례차례 살펴보자면, 7행에서 scanf 함수가 호출되고 10진수 정수를 입력받습니다. 이렇게 해서 입력된 데이터는 age 변수에 들어갑니다. 그리고 8행에서 age의 값이 첫번째 서식문자 %d에 들어가는 것입니다.
 
참고로 scanf는 자료와 자료 사이는 공백, 탭, \n등으로 구분하며 서식제어 문자열을 사용하여 지정된 형식으로 입력받기도 합니다. 설명 안해둔게 있는데 scanf의 변수명 옆에 쓰인 &이 궁금하시나요?  이 기호를 레퍼런스라고 하며, 연산자 이기도 합니다. 이 연산자는 포인터와 관련이 있으므로 뒤에서 간단히 설명하도록 하겠습니다.

&를 변수의 이름앞에 붙이면 그 변수의 주소값을 얻게됩니다. scanf는 변수명을 필요로 하지 않습니다, 대신 값을 기억시킬 변수의 주소를 묻습니다. 그래서 scanf 함수 호출시 주소값을 전달해줘야만 합니다.


  scanf에서 C4996 에러가 발생합니다. 어떻게 해야하나요?

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.


보시는 바와 같이 '이 함수 또는 변수는 안전하지 않을 수 있습니다. scanf_s를 대신 사용하는 것이 좋습니다. 사용 중단을 사용하지 않도록 설정하려면 _CRT_SECURE_NO_WARNINGS를 사용합니다. 자세한 내용은 온라인 도움말을 참조하세요.'란 내용을 담고 있습니다.


즉, '보안상의 이유로 scanf가 아닌 scanf_s를 사용해주세요!'라고 권장하는 것입니다. MSDN에서도 '일부 CRT(C Runtime Library) 및 표준 C++ 라이브러리 함수는 보안이 강화된 새 함수로 대체되어 더 이상 사용되지 않습니다.'와 같은 내용을 확인할 수 있었습니다. (버퍼 오버플로우나 버퍼 오버런 등과 같은 취약점에 대응하기 위하여 기존의 scanf에 버퍼의 크기를 넘겨줄 수 있도록 scanf_s를 사용함)


그렇다면 이 에러를 어떻게 해결할 수 있을까요? 가장 좋은 방법은 scanf 대신 scanf_s로 대체하여 사용하는 것이겠지만, 다른 방법으로도 이 에러를 무시하고 진행할 수 있습니다.


첫번째는 코드의 가장 위에 아래와 같은 전처리기 정의를 통해 해결할 수 있습니다.

#define _CRT_SECURE_NO_WARNINGS

_CRT_SECURE_NO_WARNINGS 대신 _CRT_SECURE_NO_DEPRECATE를 정의해 주어도 무방합니다. 그리고, 위의 define를 통한 해결법 대신 아래처럼 pragma를 통해 해결할 수도 있습니다.

#pragma warning(disable: 4996)

아니면 프로젝트를 생성하기 전에 나타나는 응용 프로그램 마법사에서 'SDL(Security Development Lifecycle) 검사'의 체크를 해제하고 프로젝트를 만드는 방법이 있습니다.



SDL 검사는 권장 옵션이기 때문에 기본적으로 체크가 되어있습니다. 이 검사는 '오류와 같은 추가 보안 관련 경고 및 추가 보안 코드 생성 기능'을 하며, 체크를 해제하면 C4996 에러가 경고 수준으로 바뀌며 무시하고 컴파일을 할 수 있게 됩니다. 

저작자 표시
신고
  1. 이전 댓글 더보기
  2. BlogIcon 검비 at 2013.07.11 18:12 신고 [edit/del]

    저 첫강의에서 소개해주셨던 같은 컴파일러를 쓰는데요.
    제 컴파일러에는 비쥬얼 베이직과 C#, C++밖엔 없네요.
    C++로 해보았지만 system이라는 형식이 없다고 게속 오류가납니다.
    system("pause");을 입력하지 않고 하면 명령 프롬프트창이 깜빡하고 켰다꺼집니다.
    제 컴파일러가 잘못된것인가요? 똑같은 컴파일러인지 몇번이나 확인했습니다.

    Reply
  3. at 2013.07.23 15:05 [edit/del]

    비밀댓글입니다

    Reply
  4. at 2013.07.23 16:01 신고 [edit/del]

    컴파일을 했는데 콘솔창이 까맣고 아무것도 안나오네요...?

    Reply
  5. ZiNee at 2013.08.19 13:10 신고 [edit/del]

    %g, %G 는 각각 (%f, %e), (%f, %E) 중에서 하나를 선택해서 출력한다고 알고 있습니다.
    엑시노아님, (%x, %e), (%X, %E) 중에서 하나를 선택한다고 하셨는데요,
    한 번 검토해 주세요.

    Reply
  6. 저기.. at 2013.09.27 19:55 신고 [edit/del]

    한글을 입력시킬수는 없나요?

    Reply
    • BlogIcon EXYNOA at 2013.09.27 22:13 신고 [edit/del]

      한글은 2바이트를 차지합니다. 만약 한글 5글자가 들어갈 정도의 배열이라면 NULL문자까지 고려하여 길이가 11인 문자 배열을 선언하시면 됩니다.

  7. at 2013.09.28 17:03 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2013.10.01 04:49 신고 [edit/del]

      오류가 아닙니다. stdlib.h를 포함하시고 system 함수를 사용해보세요.

      #include <stdio.h>
      #include <stdlib.h>

      int main()
      {
      printf("Hello, World!\n");
      system("pause");
      return 0;
      }

  8. hea at 2013.10.20 23:10 신고 [edit/del]

    #include <stdio.h>

    int main()
    {
    printf("Hello, world!\n");

    return 0;
    VS2012 씁니다만. 디버그 없이 실행했는데 도스창이 뜨자마자 사라지네요..

    Reply
  9. at 2013.11.03 21:35 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2013.11.04 18:53 신고 [edit/del]

      찾아보니 제어판에서 Microsoft .NET Framework 4를 모조리 제거한 뒤에 재설치하니 해결되었다는 기록이 있습니다. 한번 그렇게 해보심이 어떠신가요?

  10. at 2013.11.12 22:47 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2013.11.12 23:48 신고 [edit/del]

      2013도 마찬가지로 Visual C++ 프로젝트를 만들어 그 소스 파일 내에 C언어 코드를 그대로 작성하시면 됩니다. 그리고 역슬래시는 Backspace 바로 아래에 있는 \를 쓰시면 됩니다.

  11. 이창연 at 2014.05.26 10:56 신고 [edit/del]

    #include <stdio.h>

    int main()
    {
    int age;
    age = 18;

    scanf_s("%d, &age");
    printf("나의 나이는 %d살 입니다.", age);

    return 0;
    }

    Visual Studio 2012 C++

    Reply
  12. 이창연 at 2014.06.03 13:32 신고 [edit/del]

    #include <stdio.h>

    int main(void)
    {
    int age;
    age = 15;

    scanf_s("%d", &age);
    printf("나의 나이는 %d 살입니다.", age);

    return 0;
    }

    이렇게 했는데도 전혀 글내용처럼은 안되는데요 ;

    그리고 글내용처럼 하면 age 변수가 초기화 안되서 오류나지 않나요 ?

    대체 어떻게해야 글처럼 나오는지 ;

    Reply
    • 이창연 at 2014.06.03 13:34 신고 [edit/del]

      그리고 위처럼 했을떄 실행시키면

      빈 도스창이 뜨고 거기서 a와같이 문자를 쓰고 엔터를 눌르면

      printf 함수내용만 출력이 되는데 ;; 대체 제가 어딜 잘못한건가요 ?

    • 이창연 at 2014.06.03 13:37 신고 [edit/del]

      도스창 내용입니다

      ( 아무 문자나 입력하고 엔터를 눌르면 위와같이뜸)

      a ( 여기서 a는 아무 문자중 한개를 예로 든것)
      나의 나이는 15살입니다. 계속하려면 아무키나 누르십시요 . . .

    • BlogIcon EXYNOA at 2014.06.03 16:52 신고 [edit/del]

      %d는 정수형을 입력받겠다는 서식 포맷입니다. 입력된 a는 정수가 아니라 문자입니다. 고로, 17, 23 등과 같은 정수형 데이터를 입력해 주셔야 age에 올바른 값이 들어갑니다.

  13. 독학생 at 2014.06.10 15:05 신고 [edit/del]

    안녕하세요. scanf에 대해서 조금 더 구체적으로 설명해주실 수 있나요? 마지막 부분에서는 18이라는 숫자가 언급 된 적이 없는데 디버깅하니 %d가 18을 인식했는데 어떻게 된 건지 모르겠네요. 이미 기존에 (위에) 있었던 것에서 얻은 것 인가요? scanf("a",&b) 라고 두고 어디서 무엇을 찾는다 이런 식으로 간략한 설명 부탁드립니다.

    Reply
    • BlogIcon EXYNOA at 2014.06.10 23:45 신고 [edit/del]

      말그대로 '결과'에 있는 것은 명령 프롬프트 창의 내용을 모조리 복사하여 붙여넣은 것입니다. 여기서 18은 제가 임의로 입력한 값이라고 생각하시면 됩니다. 7행에서 scanf 함수를 통해 입력을 받으니, 제가 18이란 값을 입력하고 8행의 printf 함수를 거쳐서 '나의 나이는 18살 입니다.'라는 결과가 나오는 것입니다.

  14. 친추하고싶다이분 at 2014.12.26 19:53 신고 [edit/del]

    그머지 지금도 대답해주실지는모르겠지만 제가 코드를 이렇게 작성했거든요?
    #include <stdio.h>

    int main()
    {
    int age = 18;

    scanf("%d", &age);
    printf("나의 나이는 %d살 입니다.\n");

    return 0;
    }

    그런데 왜 도스창에 아무것도 안뜨나해서 그냥 아무거나 쳐서 엔터누르면 그때

    나의 나이는 18살입니다.
    라고 떠요 그니까 예를들자면
    asdfsgsdfsdfadsf이걸 도스창에 치면


    asdfsgsdfsdfadsf
    나의 나이는 18살입니다.

    이렇게 됍니다 어떡하나요?

    Reply
    • 지나가던사람 at 2014.12.28 22:04 신고 [edit/del]

      지나가던 사람인데 int age = 18; 에서 본인이 age값에
      18을 넣어주시고 scanf("%d",&age);라는게 도스창에서
      사용자에게 입력받는 함수같은 역할이거든여
      한마디로 사용자에게 입력을 받지 않으려면 scanf줄을 삭제해주시고
      입력받아서 "나의 나이는 ?살입니다"를 출력하려면 int age 이줄을
      삭제해주시면 될거에요

    • 지나가던또다른사람 at 2014.12.29 13:43 신고 [edit/del]

      윗분께서 설명을 달아주셨는데 조금 추가하자면,
      작성하신 코드를 봅시다.

      int age = 18; -> 변수 age에 정수 18을 대입합니다.
      scanf("%d",&age); -> 이미 정수 18을 할당받은 age에 사용자로부터 다시 정수를 입력받습니다. (scanf가 있다면 콘솔은 사용자가 엔터를 치기 전까지 대기한 후 엔터를 치면 사용자가 입력한 값을 변수에 저장합니다.)
      pfintf("나의 나이는 %d살 입니다.\n"); -> 이부분은 잘못되었습니다. printf("나의 나이는 %d살 입니다.\n",age)로 수정하셔야 합니다.

      다시 말하자면,
      처음 실행했을때 도스창에 아무것도 뜨지않는 이유는,
      scanf가 사용자로부터의 입력을 기다리는 중이라 scanf의 다음 행의 명령어인 printf가 실행되지 않았기 때문입니다.

  15. 코딩루키 at 2015.01.23 12:25 신고 [edit/del]

    scanf 문에 위에 댓글분들중 한분이랑 같은 증상이 뜹니다
    #include <stdio.h>

    int main()
    {
    int age;

    scanf("%d", &age);
    printf("나의 나이는 %d살 입니다.",age);

    return 0;
    }
    이렇게 했는데도 오류가 나오네요... 어떻게 해야하는지 ㅜㅜ
    오류 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    오류읽어보면 scanf_s 를 써라고 되있는데 저는 scanf 못쓰는건가요ㅜㅜ ...

    Reply
  16. 지나가던 행인 at 2015.06.18 15:52 신고 [edit/del]

    zlib.dll이 설치되지 않았다고 뜨든데요,이건 뭔가요?

    Reply
  17. 머라는거여 at 2016.01.28 18:30 신고 [edit/del]

    나도모름

    Reply
  18. /n 헤멤 at 2016.04.11 23:13 신고 [edit/del]

    /n을 붙였는데 cmd에 그대로 /n이 입력된데로 뜨네요.. 어떻게 하나요?

    Reply
  19. 아무것도 안떠요; at 2016.07.30 14:02 신고 [edit/del]

    Visual Studio 2015 for Windows 10 을 쓰고있습니다.
    강좌에 나온대로 아래 그대로 입력하고 하라는대로 해봤는데,

    #include <stdio.h>

    int main()
    {
    printf("Hello, world!\n");

    return 0;
    }

    어떤 창 하나 나오고 아무것도 뜨지를 않네요;

    Reply
    • BlogIcon InitCode at 2016.08.18 04:22 신고 [edit/del]

      창이 빠르게 사라지는 경우라면 ctrl+f5
      혹은 #include<Windows.h>를 추가하신 뒤, return 0; 윗줄에 system("pause");를 넣어주시면 됩니다.

  20. BlogIcon EXYNOA at 2016.09.27 22:33 신고 [edit/del]

    C4996 에러로 도중에 막히신 분들이 좀 보이는 것 같아서 그에 대한 통상적인 해결 방법을 마련했습니다.
    자세한 내용은 강좌 게시글 내의 'scanf에서 C4996 에러가 발생합니다. 어떻게 해야하나요?'를 참고하시기 바랍니다.

    Reply
  21. 낙타그래머 at 2017.06.15 14:01 신고 [edit/del]

    3강까지 정말 재미있게 보고 있습니다.
    차근차근히 따라가니 정말 재밌습니다.
    감사드립니다.

    Reply

submit


1-1. 변수(Variable)


변수(Variable)란 무엇일까요? 이미 익히 들어보신 분도 계실거라 생각합니다. 변수란 쉽게 말하면 값을 담아두는 기억 공간입니다. 변수는 하나의 데이터 값을 가질수 있으며, 한번 정해진 값은 고정되어 있는게 아니라 계속 변할수 있는 수입니다. 이는 즉, 대입되는 수가 항상 변할수가 있다는 말입니다. 또한, 이 변수는 담기는 음식에 따라 그릇이 달라지듯 담기는 데이터에 따라 변수의 자료형(Data Type)이 결정됩니다. 문자는 문자를 담을수 있는 자료형이 있으며, 정수는 정수를 담을수 있는 자료형이, 실수는 실수를 담을수 있는 자료형이 따로 존재합니다.


우선 C언어에서의 기본 자료형(Data Type)은 무엇이 있는지에 대해 간단히 보도록 하겠습니다. 아래의 표에서 자료형의 크기가 크면 클수록 값의 표현범위는 어떻고, 작으면 작을수록 값의 표현범위가 어떻게 달라지는지 유심히 살펴보시기 바랍니다.


자료형

크기

값의 표현범위

정수형

char

1바이트

-128이상 +127이하

short

2바이트

-32,768이상 +32,767이하

int

4바이트

 -2,147,483,648이상 +2,147,483,647이하

long

4바이트

-2,147,483,648이상 +2,147,483,647이하

long long

8바이트

-9,223,372,036,854,775,808이상

+9,223,372,036,854,775,807이하

실수형

 float

4바이트

±3.4 ×10^-37이상 ± 3.4 × 10^38이하

double

8바이트

 ±1.7 ×10^-307이상 ± 3.4 × 10^308이하

long double

8바이트 이상

 double 이상의 표현범위


정수형 자료형을 살펴보시면 char, short, int, long, long long이 있으며 실수형 자료형에는 float, double, long double이 있습니다. 이런 자료형이 여러개 존재하는 이유는 데이터 표현방식이 다르고, 효율적인 메모리 공간 활용을 하기 위함이며, 자료형의 크기가 클수록 값의 표현범위도 함께 커짐을 쉽게 알수 있습니다. 그리고 또 하나는 부호가 있느냐 없느냐에 따라서 부호가 있는 변수(signed)와 부호가 없는 변수(unsigned)로 나뉘게 됩니다.


구분

키워드

설명

부호가 있는 변수

signed

기본(default) 형식

부호가 없는 변수

unsigned

부호가 생략되면 unsigned 형식이며, 값의 표현범위가 두배 정도 늘어남


기본 자료형은 모두 부호가 있는(signed) 자료형이며, 양의 표현범위를 더 늘리기 위하여 unsigned 키워드를 붙여줄 수 있습니다. 만약 int에 unsigned를 붙여준다면 0이상 4,294,967,295이하의 수(unsigned int)를 표현할 수 있습니다. 하나 더 예를들어 long long에 unsigned를 붙여준다면 0이상 18,446,744,073,709,551,615이하의 수(unsigned long long)를 표현할 수 있게됩니다. (참고로 실수에는 unsigned가 붙을 수 없습니다.)


그렇다면 실제로 우리가 int 자료형을 사용하여 정수 데이터를 변수에 담으려고 한다면 어떻게 해야할까요? 우선 int 자료형을 앞에다 붙여야 한다는건 알고 있습니다. 그런데 이 변수에 접근을 하여 값을 가져오고 다시 담으려면 각 변수만이 가지고 있는 고유한 특징이 있어야 합니다. 그래야 변수를 구분하고 접근할 수 있으니까요. 다른 프로그래밍 언어도 마찬가지로 변수에는 변수명(=식별자)이라는 것이 존재하며, 이 변수명은 말 그대로 변수의 이름을 의미합니다. 물론 이 변수의 이름은 우리가 붙여줄 수 있습니다. 아래를 한번 보도록 합시다.


int num;


위의 코드가 의미하는 것은 무엇일까요? num이란 이름을 가진 int형 변수라는 것임을 알 수 있습니다. 그리고 이 num이란 변수의 이름을 가지고 이 변수에 정수형 값을 넣어줄 수 있습니다. 물론 값의 표현범위의 한에서만 말이죠.


num = 47;


위의 코드는 num이란 변수에 47이란 값을 대입(=)하는 코드입니다. 저렇게 값을 넣어주고서, 그 아래에 또다른 코드를 추가하여 다른 값을 또 넣을수 있습니다. 고정되어 있는 수가 아닌 항상 변할수 있는 수니까 가능한 얘기겠죠? 참고로 가장 마지막에 붙는 세미콜론(;)은 각 문장을 구분함으로써 한 문장이 끝나면 반드시 문장의 끝을 알리는 세미콜론(;)을 붙여주어야만 합니다.


한가지 더 알아두실게 있다면, 변수에 이름을 붙히기 전에도 조건이 있습니다. 첫번째 글자는 반드시 영어이어야 하며, 언더바(_) 기호를 문자로 취급하여 변수명에 사용이 가능합니다. 대소문자 구분이 가능하며(num과 Num는 다른 변수), 기본적으로 예약어는 변수명으로 사용할 수 없습니다. 여기서 예약어는 int, char, long, typedef, auto 등을 말합니다. 변수명 길이에 제약은 없으나 되도록이면 길게쓰지 않는게 좋습니다. 변수명을 기억하기가 더 어려워지고 오타를 입력할 가능성이 많아지기 때문에 바람직하지 않습니다. 


이제 변수에 대해 간략하게 정리를 해보았는데, 잠깐의 시간이나마 조금 더 깊숙히 들어가보도록 합시다.


1-2. 실제로 데이터가 기억되는 장소


실제로 데이터가 기억되는 장소는 어디일까요? 위에서는 변수란 값을 담아두는 기억 공간이라고 말했습니다. 사실 이 변수를 또 다르게 정의하면 변수란 값을 저장하고 참조할 수 있는 할당된 메모리 공간이라 얘기할 수 있습니다. 예를 들어보자면, int는 메모리에서 4바이트의 공간을 차지하며, double은 메모리에서 8바이트의 공간을 차지합니다. 아래와 같이 int형 변수 a를 만들었다고 가정해봅시다.


int a;


그리고 이것이 메모리 공간에서는 어떻게 표현이 되는지 아래의 그림을 보도록 합시다.


<10진수 정수형 변수 a의 메모리 할당>


임의의 공간에 4바이트 만큼의 메모리 공간을 할당하며, 컴파일러는 이 공간에다가 a라는 이름을 붙여줍니다. 이제 우리는 이 a라는 이름을 통하여, 이 공간에 접근을 할 수 있게 되는 것입니다. (변수는 하나의 주소값을 가지며, 이에 대한 설명은 후에 '포인터' 강좌에서 이어서 설명합니다.)


2. 상수(Constant)


위에서 배운 변수가 항상 변할수 있는 수라면 상수(Constant)는 고정되어 있는 수를 말합니다. 예를 들어서, 4x+6y=38란 식중 4,6,38은 상수이고 x,y는 등호만 성립하면 변경될수 있기 때문에 변수라 부릅니다. 프로그래밍에서 말하는 상수와 변수도 중학교 과정을 거칠때 배우는 변수, 상수와 크게 다를게 없습니다.


프로그래밍에서의 상수는 메모리 공간에 저장되어 있으나 변경할수 없으며, 상수에서 다시 리터럴 상수(Literal Constant)와 심볼릭 상수(Symbolic Constant)로 나뉘는데 리터럴 상수는 '이름을 지니지 않는 상수', 심볼릭 상수는 '이름을 지니는 상수'라고 생각하시면 됩니다. 값을 표기하면 컴파일러가 그 크기와 형태를 보고 적당한 자료형을 선택합니다. 상수를 표현하려면 const란 키워드를 자료형 앞에다 붙여주면 됩니다. 그렇다면 아래의 예에서 리터럴 상수와 심볼릭 상수를 구분해 보도록 할까요?


int num = 40 + 50;

const int A = 66;


위의 예제를 보자면 40과 50, 그리고 66은 자기 자신이 곧 상수를 의미하는 리터럴 상수이며 A는 이름을 가진 상수로써 심볼릭 상수라고 말할 수 있습니다. (심볼릭 상수는 매크로를 통하여 정의할 수 있지만 이는 나중에 설명하도록 하겠습니다.) const 상수는 대표적인 심볼릭 상수라고 말할 수 있습니다. 이 const 키워드가 붙으면, 변수에 저장된 값이 변경되는것을 막을수 있습니다. 한번 초기화 된 값은 변경하지 못하며, 초기화 값을 지정해주지 않아도 쓰레기 값으로 초기화 되어 선언 이후로부터 변경이 불가능합니다. 


참고로, 상수의 이름은 대문자로 표시하며, 둘 이상의 단어를 함께 묶을때는 언더바(_)로 단어를 이어서 이름을 짓습니다. 이것은 변수와의 구분을 쉽게 하기 위함이며, 많은 프로그래머 들이 선택하는 네이밍 규칙이기도 합니다.


접미사 

자료형

사용 예

u 혹은 U

unsigned int

304U

l 혹은 L

long

304L

ul 혹은 UL

unsigned long

304UL

f 혹은 F

float

3.15F

l 혹은 L

long double

3.15L


위의 표는 접미사에 따른 정수형 상수, 실수형 상수들의 예를 든것입니다. 위에서 말씀드렸듯이 '값을 표기하면 컴파일러가 그 크기와 형태를 보고 적당한 자료형을 선택한다' 라고 했었죠? 실제로 Visual Studio 2012를 실행하고, C 프로젝트를 생성하여 메인 함수 내에 다음과 같은 코드를 작성하면 컴파일 과정에서 경고 메시지를 볼 수 있습니다.


float f1 = 3.14;


warning C4305: '초기화 중' : 'double'에서 'float'(으)로 잘립니다.


왜냐하면 3.14는 8바이트 double형 상수로 생각하며, 이 값을 저장하는 변수는 4바이트 float형이기 때문에 값이 잘려나갈수 있음을 경고한 것입니다. 이때는 3.14f와 같이 f 접미사를 붙여 float형 상수로 자료형을 변경시킬 수 있습니다. (3.14가 float형으로 충분히 표현할 수 있음에도 불구하고, 따로 f 접미사를 붙여주어야 하는 이유는 부동소수형 상수, 즉 실수는 기본적으로 double형이라고 간주해버리기 때문입니다.)

저작자 표시
신고
  1. BlogIcon 유키웹 at 2012.02.08 01:17 신고 [edit/del]

    감솨감솨
    정독(?)했습니다ㅋ

    Reply
  2. 김상완 at 2012.03.16 10:00 신고 [edit/del]

    정독중입니다.ㅋㅋ

    Reply
  3. 강나리 at 2012.04.24 16:49 신고 [edit/del]

    float형과 double형의 소수점 아래 자리에 대해 궁금합니다.ㅋㅋㅋ

    Reply
  4. 김진용 at 2012.05.24 10:47 신고 [edit/del]

    강좌 처음부터 보는중인데 잘보고있습니다~

    Reply
  5. 김승현 at 2012.09.13 03:55 신고 [edit/del]

    감사합니다~

    Reply
  6. at 2012.10.16 19:51 [edit/del]

    비밀댓글입니다

    Reply
  7. at 2012.11.16 22:36 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2012.11.16 23:08 신고 [edit/del]

      const에 대한 설명이 더 필요하다 싶으시면 언제든지 말씀해주세요. 저 코드에서 에러가 나는 이유는, cnum이 선언될때 앞에 const 키워드가 붙어 한번 초기화된 값은 변경하지 못하게 막아 오류가 나는 것입니다.

      공부 방법은 역시, 이것저것 만들어보고 응용해보면서 부딪히는 수 밖에 없을것 같습니다. 가장 좋은 방법이기도 하구요. 경험은 즉 실력으로 이어지죠.

  8. ZiNee at 2013.08.18 23:47 신고 [edit/del]

    강좌가 참 깔끔하고 또한 핵심을 잘 다루었네요.
    좋은 강좌 올려주셔서 감사합니다.
    정독하여 내공 상승하도록 힘 쓰겠습니다.

    Reply
  9. 생초보 at 2013.11.15 15:26 신고 [edit/del]

    const 에서 변경이 불가하다는게, 동일 코드 내에서 선언 이후에 다시 사용할때만 불가능한거죠?
    예를들면, 처음 선언한 코드 그 자체를 수정한다거나, 다른 코드에서는 변경이 가능한거죠??

    Reply
  10. 생초보 at 2013.12.16 15:00 신고 [edit/del]

    int 랑 long 은 표의 내용으로 봐서는 완전히 똑같아 보이는데,
    long은 구태여 왜 만든걸까요??

    Reply
    • BlogIcon EXYNOA at 2013.12.16 18:13 신고 [edit/del]

      반드시 어떤 환경이든 크기가 똑같은게 아니고, 운영체제든 컴파일러 등의 환경에 따라서 int 같은 자료형은 크기가 변합니다.

  11. BlogIcon 깜짝놀란곰 at 2013.12.18 03:46 신고 [edit/del]

    잘 읽고 갑니다.
    시간 나는대로 틈틈이 프로그래밍을 공부하려 하는데 큰 도움이 되었네요.

    Reply
  12. 조준호 at 2014.09.28 15:09 신고 [edit/del]

    사랑해요

    Reply
  13. 강과장님 at 2016.01.26 15:06 신고 [edit/del]

    궁금한점이 있어서요 !
    char c = 14; 이렇게 선언하면서 초기화가 가능하잖아요 근데 '14'는 int 형인데 char 형 c에 저장될 때 접미사가 필요하지 않잖아요 왜 그런거죠 ??

    Reply
  14. 강좌 at 2016.02.17 14:46 신고 [edit/del]

    강좌 정주행중!! 감사합니다.

    Reply
  15. 낙타그래머 at 2017.06.15 10:47 신고 [edit/del]

    자바 배우고 C공부 중인데 정말 도움이 많이 됩니다.
    감사합니다. 정주행하겠습니다.

    Reply

submit


1-1. C언어의 시작


컴퓨터를 잘 모르시는 분들도 내부에서 이동하는 데이터는 '0'과 '1'로만 구성된 디지털 신호의 조합이라는 것을 알고 계실겁니다. 우리가 이 컴퓨터에게 어떤 특수한 명령을 내리려면 어떻게 해야만 할까요? '0'과 '1'로 이루어진 복잡한 기계어 까지 알아야만 할까요? 만약 기계어를 배워야 한다면 너무 어렵고 비효율적일 것입니다. 사람이 이해하고 터득하기 쉬운 언어를 고급 언어라 하며, 고급 언어 중 우리가 지금부터 배우게 될 C언어도 포함됩니다.


물론 C언어를 컴퓨터가 바로 이해하는것은 아닙니다. 사람이 작성한 언어를 기계어로 바꾸어 주는 '컴파일러'가 있기에 가능한겁니다. 컴파일러는 뒤에서 다시 설명하겠습니다. 이 C언어는 켄 톰슨과 데니스 리치에 의해 만들어졌으며 특징으로는 절차지향적, 효율성, 이식성 등을 꼽을수 있겠습니다. 자, 이제부터 우리가 작성한 소스 파일이 어떠한 과정을 거쳐서 실행 파일이 되는지 한번 살펴보도록 합시다.

1-2. 소스 파일, 오브젝트 파일, 실행 파일

 
한번 차례대로 살펴보도록 합시다. 제일 첫단계에서 우리가 배우게 될 C언어로 소스 코드를 작성합니다. 그리고 확장자가 .c인 파일에 저장합니다. 이렇게 작성된 문서를 소스 파일이라 하며, 이 소스파일의 컴파일의 대상이 됩니다. 아직은 0과 1만을 이해할수 있는 컴퓨터는 우리가 작성한 소스 코드를 바로 이해하지 못합니다. 별도의 과정을 거치고 나서야 컴퓨터가 그것을 이해하고 명령을 실행할 수 있는거죠.


그리고 작성된 소스 코드는 컴파일에 앞서 전처리 과정을 거치는데, 전처리 과정이란 #include, #define, #if와 같은 지시자를 처리하는 과정을 말하는 것입니다. 그 후에, 컴파일러에 의해 .i의 확장자를 가진 파일이 어셈블리 코드인 .s란 확장자를 가진 파일로 컴파일 되고, 어셈블러에 의해 .s의 확장자를 가진 파일이 .o의 확장자를 가진 오브젝트 파일로 컴파일 됩니다. 간단히 정리하자면, 작성된 .c 파일이 전처리 과정을 거치고 컴파일러에 의해 어셈블리 코드로 변환됩니다. 그다음 어셈블러에 의해 바이너리 코드로 변환됩니다. 그러나 컴파일러가 어셈블러의 역할까지 담당하므로 컴파일 시 바로 바이너리 코드가 생성됩니다. 이 바이너리 코드는 오브젝트 파일(확장자가 .obj)인 파일에 저장이 되며 링커의 링킹 대상이 됩니다.


최종적으로 .o 파일은 링커에 의해 표준 C 라이브러리와 링크되어 실행 파일(.exe)이 만들어지게 됩니다.


1-3. 강좌에 쓰일 컴파일러 소개


이제 그 컴파일러를 어디서 구할수 있는지 알아보겠습니다. 컴파일러는 매우 다양합니다. Visual C++ 혹은 코드블록, Dev C++ 등이 있으며 이 강좌에서는 Visual Studio 2012를 다운로드 받아 2012를 기준으로 강좌를 작성하도록 하겠습니다. 아래에 링크를 걸어두었으니 해당 링크로 이동하여 Visual Studio 2012 Express를 다운로드 합시다.


다운로드: http://www.microsoft.com/visualstudio/kor/downloads


해당 사이트로 이동하셨으면, Visual Studio Express 2012 for Windows Desktop를 클릭하여 다운로드 언어를 한국어로 선택하고 아래의 설치 옵션에서 Windows Desktop용 Visual Studio 2012 Express - 한국어의 지금 설치를 클릭합니다. 그리고 wdexpress_full.exe가 다운로드 되면 바로 실행시킵니다.



동의함에 체크하고 설치를 누릅니다. '사용자 환경 개선 프로그램에 참여하여 Visual Studio의 품질, 안정성 및 성능을 개선하는 데 도움을 주십시오.'에 체크하셔도 괜찮습니다.
 


설치가 진행 중입니다. 다소 시간이 오래 걸릴수 있으니 설치가 되기를 기다립시다.


설치가 완료되었으면, 아래에 있는 시작을 누릅시다.



이런 창이 뜨면, 온라인 등록을 눌러 설문조사를 하고 제품 키를 받아야만 합니다. 마이크로소프트 사이트에 가입해야 설문조사를 할 수 있으니, 아이디가 없으신 분은 먼저 가입을 하시고 설문조사를 거쳐 제품키를 받으세요.


이렇게 제품키를 받으셨으면, 다시 제품키 등록창으로 돌아가 등록 후 비주얼 스튜디오 2012를 실행시킵니다. 사용자 설정 로드 후 비주얼 스튜디오가 정상적으로 실행됬다면 설치를 무사히 마친것입니다. 성공적으로 설치를 하셨으면, 비주얼 스튜디오를 실행하여 이것저것 한번 둘러보도록 합시다. 여기까지 읽으시느라 수고 많으셨고, 다음 강좌부터 본격적으로 C언어에 들어가보도록 하겠습니다.

저작자 표시
신고
  1. 김준영 at 2012.01.13 20:45 신고 [edit/del]

    잘보고갑네다 ㅇㅅㅇ

    Reply
  2. Test at 2012.01.14 11:19 신고 [edit/del]

    수고하십니다.

    Reply
  3. 김상완 at 2012.03.16 09:54 신고 [edit/del]

    잘보고 가요.
    개인차이지만 영어보다 더 어렵네요...

    Reply
  4. 박선우 at 2012.09.08 23:09 신고 [edit/del]

    감사용 좀 어렵네요 ㅠㅠ

    Reply
  5. 김승현 at 2012.09.13 03:33 신고 [edit/del]

    감사합니다~

    Reply
  6. xotksdlsp at 2013.03.11 19:52 신고 [edit/del]

    첫번째 강좌 고맙습니다!!! ^^

    Reply
  7. 이정현 at 2013.03.31 22:01 신고 [edit/del]

    c언어 처음 시작하는데 조금어렵내요..

    그래도 잘보고갑니다^^

    Reply
  8. ZiNee at 2013.08.18 23:45 신고 [edit/del]

    강좌 잘 읽었습니다.
    정독했습니다.
    앞으로 시간내어서 계속 정독하여 나가겠습니다.
    좋은 강좌 올려주셔서 감사합니다.

    Reply
  9. 신JOWO at 2013.12.31 16:30 신고 [edit/del]

    근데 런타임 오류가 뜨는이유가뭐죠,,?

    Reply
  10. 2917 at 2014.01.28 09:25 신고 [edit/del]

    아무리 찾아봐도 2012버젼 윈도우용은 안보이는데 2013을 받아서 해야 하나요?
    그럴경우 다운로드 옵션을 뭘로 해야하나요?

    Reply
  11. BlogIcon ctrl+prompt=programming at 2014.03.23 17:07 신고 [edit/del]

    안녕하세요. C언어 깅좌 아주 잘 모바일폰으로 잘 봤습니다. 구체적인 그림으로 싑게 설명해 주신점 감사합니다.
    제가 드릴꺼는 댓글 업로드 같네요.^^ 세상이 좋아져서 스마트폰으로 간단하고 편하게 볼수있다는점에 연산기계와의 친분을 쌓아 올리는것이 꼭 필요한거 같네요. 저 같은 생초보자에게 쉽게 이해 할수있는 강좌 또 한버 감사인사 드립니다.^^

    Reply
  12. 독학생 at 2014.06.10 10:28 신고 [edit/del]

    오랜만에 왔네요 파이썬 공부하다가 일단 c먼저 해야겠습니다. 좋은 하루 보내세요!

    Reply
  13. 탕큰탕큰 at 2014.09.14 14:20 신고 [edit/del]

    오옿ㅎㅎㅎㅎㅎㅎ
    매우 자세하게 설명되있군요 헤헿
    제 꿈에 다가갈 길을 열여주시는걸 도와주셔서 감사합니다ㅎㅎㅎㅎ

    Reply
  14. 모과 at 2015.01.05 13:06 신고 [edit/del]

    감사합니다...이제 공부 시작하려구요^^

    Reply
  15. 컴알못자 at 2017.01.07 15:26 신고 [edit/del]

    혼자서 파이썬 공부 시작했는데 참고할만한 강의 찾다가 들어오게 되었어요^^ 감사합니다.

    Reply
  16. 낙타그래머 at 2017.06.15 09:59 신고 [edit/del]

    정말 소중한 강의 감사드립니다.
    잘보고 배우겠습니다.

    Reply

submit

티스토리 툴바