반응형

안녕하세요.

오늘은 C언어에서 문자열을 비교할 수 있는 함수인 strcmp와 strncmp 함수에 대해 알아보도록 하겠습니다.

strcmp

함수 원형
int strcmp( const char *string1, const char *string2);

헤더 파일
string.h

설명
두 문자열을 비교합니다.
string1과 string2 두 문자열을 비교합니다.

리턴값
리턴값이 -1 일 때 -> 두 문자열을 비교하여, 틀린 첫번째 문자가 string1이 더 작을 때 -1을 리턴합니다.
리턴값이 0 일 때 -> 두 문자열이 같습니다.
리턴값이 1 일 때 -> 두 문자열을 비교하여, 틀린 첫번째 문자가 string1이 더 클 때 1을 리턴합니다.

예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString1[20= "world!!";
    char arrString2[20= "worlc!!";
    char arrString3[20= "worlf!!";
    char arrString4[20= "world!!";
 
    int nReturn1 = strcmp(arrString1, arrString2);
    int nReturn2 = strcmp(arrString1, arrString3);
    int nReturn3 = strcmp(arrString1, arrString4);
 
    
    printf("strcmp(%s, %s) return : %d\n", arrString1, arrString2, nReturn1);
    printf("strcmp(%s, %s) return : %d\n", arrString1, arrString3, nReturn2);
    printf("strcmp(%s, %s) return : %d\n", arrString1, arrString4, nReturn3);
}
 
cs

 

10번째 줄은 "world!!"와 "worlc!!"를 비교합니다. "worl"까지는 같다가 'd'와 'c'가 다른데

'd'가 'c'가 아스키코드상의 10진수 상수로 봤을 때에는 68과 67이기 때문에 d가 더 큽니다.

매개변수 string1과 string2중에 string1이 더 크면 1이 리턴되기 때문에 strcmp(arrString1, arrString2)에서는 1이 리턴됩니다.

 

 

11번째 줄은 "world!!"와 "worlf!!"를 비교합니다. 여기도 "worl"까지는 같다가 'd'와 'f'가 다릅니다.

'd'와 'f'는 아스키코드상의 10진수 상수로 봤을 때, 68과 70이기 때문에 d가 작습니다.

매개변수 string1과 string2중에 string1이 더 작으면 -1이 리턴되기 때문에 strcmp(arrString1, arrString3)는 -1이 리턴됩니다.

 

 

12번째 줄은 두 값이 같기 때문에 0이 리턴됩니다.

 

 

strncmp

함수 원형
int strncmp( const char *string1, const char *string2, size_t count);

헤더 파일
string.h

설명
지정한 사이즈 만큼 두 문자열을 비교합니다.
string1과 string2 두 문자열을 count만큼 비교합니다.

리턴값
리턴값이 -1 일 때 -> 두 문자열을 count까지 비교하여, 틀린 첫번째 문자가 string1이 더 작을 때 -1을 리턴합니다.
리턴값이 0 일 때 -> 두 문자열이 count까지의 문자열이 같습니다.
리턴값이 1 일 때 -> 두 문자열을 count까지 비교하여, 틀린 첫번째 문자가 string1이 더 클 때 1을 리턴합니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString1[20= "world!!";
    char arrString2[20= "worlc!!";
    char arrString3[20= "worlf!!";
    char arrString4[20= "worldd!!";
 
    int nReturn1 = strncmp(arrString1, arrString2, 5);
    int nReturn2 = strncmp(arrString1, arrString3, 5);
    int nReturn3 = strncmp(arrString1, arrString4, 5);
 
 
    printf("strncmp(%s, %s, 5) return : %d\n", arrString1, arrString2, nReturn1);
    printf("strncmp(%s, %s, 5) return : %d\n", arrString1, arrString3, nReturn2);
    printf("strncmp(%s, %s, 5) return : %d\n", arrString1, arrString4, nReturn3);
}
 
cs

11번째 줄(strncmp(arrString1, arrString2, 5))에서는 "world!!"와 "worlc!!"의 5개 문자까지 비교합니다.

그러므로 "!!"는 빠지고 "world"와 "worlc"만 비교하게 됩니다.

"worl"까지는 서로 같기 때문에 "d"와 "c"로 리턴 값이 결정되는데, 아스키 코드로 봤을 때는 'd'가 더 큰 값을 가집니다.

매개변수 string1과 string2중 string1의 값이 더크면 1을 리턴하게 되는데, 

strncmp(arrString1, arrString2, 5)에서는 arrString1값이 더 크기 때문에 1을 리턴하게 됩니다.

12번째 줄에서는 "world!!"와 "worlf!!"의 5개 문자까지 비교합니다.

그러므로 "!!"는 빠지고 "world"와 "worlf"만 비교하게 됩니다.

"worl"까지는 서로 같기 때문에 "d"와 "f"로 리턴 값이 결정되는데, 아스키 코드로 봤을 때는 'd'가 더 작은 값을 가집니다.

매개변수 string1과 string2중 string1의 값이 더 작으면 -1을 리턴하게 되는데, 

strncmp(arrString1, arrString3, 5)에서는 arrString1값이 더 작기 때문에 -1을 리턴하게 됩니다.

13번째 줄에서는 "world!!"와 "worldd!!"의 5개 문자까지 비교합니다.

문자열 전체로 봤을 때는 다른 문자열이지만, 5개 문자까지만 비교하기 때문에, 각각 "!!"와 "d!!"는 비교 대상에서 제외가 됩니다.

그러므로 둘은 똑같이 문자열로 비교되어 strncmp(arrString1, arrString4, 5)은 0이 리턴됩니다.

반응형
반응형

안녕하세요.

오늘은 문자열을 복사하는 함수인 strcpy와 strncpy에 대해 알아보도록 하겠습니다.

 

strcpy

함수 원형 
char * strcpy (char *_Dest, const char *_Source);


헤더 파일
string.h


설명  
문자열을 복사를 합니다. 
복사할 문자열(_Source) 변수 크기는 복사될 문자열(_Dest) 변수보다 작거나 같아야 합니다.(종료 null문자 포함)

복사할 문자열(_Source)의 '\0'까지 복사됩니다.


반환 값
_Dest 포인터 값이 반환됩니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20= "TEST";
    strcpy(arrDestString, arrString);
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
cs

 

다음과 같이 널까지 그대로 스트링 복사가 됩니다.

 

strncpy

함수 원형 
char * strncpy (char *_Dest, const char *_Source, size_t _Count);

헤더 파일
string.h

설명  
문자열을 _Count만큼 복사를 합니다. 
지정한 크기만큼만 복사합니다.

_Count크기는 _Dest의 데이터 크기보다 작거나 같아야합니다.

반환 값
_Dest 포인터 값이 반환됩니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20= "TEST";
    
    strncpy(arrDestString, arrString, 2);
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
 
cs

 

arrString의 앞에 두글자(H,e)만 복사가 되게 됩니다. 

근데 이렇게 하면 문제가 생길 수 있습니다.

만약에 6번쨰줄에 arrDestString가 초기값이 없이, 

char arrDestString[20];

이렇게만 선언되어 있는 상태에서 strncpy가 된다면 어떻게 될까요??

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20];
 
    strncpy(arrDestString, arrString, 2);
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
cs

결과값은 다음과 같이 됩니다.

원하는 결과는 "He"만 복사되어야하는데, "He"가 복사가 되었지만, 먼가 이상한 깨진 글자가 나오고 Hello world!!가 나오네요..

문제는 He를 복사하고 '\0'(null) 문자끝을 나타내는 널이 없기 때문에 출력할 때 이런 문제가 발생하는 겁니다.

다음과 같이 코드를 수정할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20];
 
    strncpy(arrDestString, arrString, 2);
 
    arrDestString[2= '\0';
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
cs

10번줄에 "arrDestString[2= '\0';" 코드를 추가하였습니다.

결과값은 다음과 같이 원하던대로 "He"만 출력되게 됩니다.

반응형
반응형

안녕하세요.

오늘은 C언어의 구조체에 대해 알아보도록 하겠습니다.

 

구조체

여러 변수들을 하나로 뭉쳐 관리가 편하게 접근할 수 있게 하는 것이 구조체입니다.

형식

struct 구조체명
{
    데이터타입 변수명1;
    데이터타입 변수명2;
           :
           :
} 구조체변수명;

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
#pragma warning(disable: 4996) // VS2019 일떄 필요합니다.
void main()
{
    struct Student
    {
        char sName[10];
        int nAge;
        char sAddress[32];
    }student;
    
    strcpy(student.sName,"AAAAA");
    student.nAge = 10;
    strcpy(student.sAddress,"Seoul, Republic of Korea");
 
    printf("student.sName : %s\n", student.sName);
    printf("student.nAge : %d\n", student.nAge);
    printf("student.sAddress : %s\n", student.sAddress);
}
 
cs

구조체의 필요성

만약에 다음과 같은 학생 정보에 대한 데이터가 있는 코드가 있습니다.

char sName[5][10];
int nAge[5];
char sAddress[5][32];

구조체를 사용하지 않아도, 배열로 데이터를 관리할 수 있습니다.
프로그램을 유지보수하게 되어 학생정보가 아닌 선생님정보가 추가해야하거나
교직원 정보를 추가해야한다면 다음과 같이 코드를 만들어야 할 것 입니다.

char sStudentName[5][10];
int nStudentAge[5];
char sStudentAddress[5][32];
char sTeacherName[5][10];
int nTeacherAge[5];
char sTeacherAddress[5][32];
char sSchoolstaffName[5][10];
int nSchoolstaffAge[5];
char sSchoolstaffAddress[5][32];

이렇게 되면 가독성이 현저히 떨어지기 때문에 구조체로 관리하는게 조금 더 수월하게 관리할 수 있을 것 입니다.

 

typedef

보통 구조체를 정의하고 사용하려면 다음과 같이 코드를 작성해야합니다.

struct Student
{
    char sName[10];
    int nAge;
    char sAddress[32];
};

struct Student student;

struct가 구조체란 뜻이 되므로 struct를 구조체이름과 같이 붙여야 구조체를 선언할 수 있습니다. 

typedef를 사용하면 struct를 붙이지 않고 구조체를 선언할 수 있습니다. 

다음과 같이 정의합니다.

typedef struct Student
{
    char sName[10];
    int nAge;
    char sAddress[32];
}STUDENT;

STUDENT student;

이때 STUDENT은 구조체 데이터가 아니라 struct Student를 대신하는 이름이 됩니다.

 

구조체 멤버 참조

구조체 멤버 참조는 "."(도트)연산자를 이용해서 참조합니다.

 

구조체 포인터

포인터 변수를 이용해서 구조체를 포인터로 접근할 수 있습니다.

포인터 변수를 참조할 때에는 "->"(에로우)연산자를 이용해서 참조합니다.

다음과 같이 참조합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h>
#pragma warning(disable: 4996// VS2019 일떄 필요합니다.
 
void main()
{
    typedef struct Student
    {
        char sName[10];
        int nAge;
        char sAddress[32];
    }STUDENT;
 
    STUDENT student;
    STUDENT* pStudent = &student;
    strcpy(pStudent->sName, "AAAAA");
    student.nAge = 10;
    strcpy(student.sAddress, "Seoul, Republic of Korea");
 
    printf("student.sName : %s\n", pStudent->sName);
    printf("student.nAge : %d\n", pStudent->nAge);
    printf("student.sAddress : %s\n", pStudent->sAddress);
}
 
cs

pStudent->sName 대신 (*pStudent).sName를 사용할 수도 있습니다.

 

자기참조 구조체

구조체 멤버변수는 어떠한 타입도 가능하다. 다른 구조체 타입도 가능하다.

자기 자신은 포인트 형태로 가질 수 있다.

typedef struct Student
{
    char sName[10];
    int nAge;
    char sAddress[32];
    struct Student* stu;
}STUDENT;

 

구조체의 메모리 배치 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
 
void main()
{
    typedef struct Player
    {
        char sName[3];
        int nJob;
        char chType;
        int nAge;
        short shPoint;
    }PLAYER;
 
    PLAYER student;
    printf("student size : %d\n"sizeof(PLAYER));
}
 
cs

다음과 같이 구조체의 사이즈를 확인해보면 20이 나옵니다.

데이터 타입으로 계산하면 sName(3) + nJob(4) + chType(1) + nAge(4) + shPoint(2) = 14가 나와야하는데 이상합니다.

구조체 변수의 메모리 배치는 4의 배수 단위로 배치됨으로 인해 

sName(4) + nJob(4) + chType(4) + nAge(4) + shPoint(4) = 20 으로 계산이 됩니다.

그러므로 다음과 같이 수정해야 구조체 사이즈를 줄일 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
 
void main()
{
    typedef struct Player
    {
        char sName[3];
        char chType;
        short shPoint;
        int Job;
        int nAge; 
    }PLAYER;
 
    PLAYER student;
    printf("student size : %d\n"sizeof(PLAYER));
    
}
 
cs

이렇게 구현하면 sName(3) + nJob(1) + shPoint(4) + chType(4) + nAge(4) = 16 됩니다.

작은 사이즈의 변수타입부터 넣고 큰 사이즈 변수를 넣는게 사이즈를 줄일 수 있는 방법입니다.

반응형
반응형

안녕하세요.

오늘은 C언어의 함수에 대해 알아보도록 하겠습니다.

함수

함수(Function)를 뜻을 영어사전에서 찾아보면, 기능이라는 뜻이 됩니다.

C언어에서도 기능을 따로 분리해서 코딩을 할 수 있습니다.

우리가 자주 사용하는 printf가 대표적인 예가 될 수 있습니다.

출력하는 기능을 이용하고 싶은데 printf에 들어있는 코드들을 모두 main함수에 넣을 수는 없기 때문입니다.

형식

반환자료형 함수명(매개변수1, 매개변수2)
{
    구문;
    return 반환값;
}

반환할 자료형(int, float등)을 정하고 매개변수에 값을 넣어서 함수에 전달해줍니다.

함수가 종료되기 전에 return으로 값을 반환합니다.

반환자료형이 void라면 return 값이 필요없습니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void printA(int nNum)
{
    printf("printA : %d\n", nNum);
}
 
void main()
{
    int nNum = 5;
    printA(nNum);
}
cs

printA라는 함수를 만들었습니다.
매개변수에 nNum값을 넘겨주면 "printA : 5"가 출력이됩니다.

함수는 main함수보다 윗줄에 코딩하거나 아니면 다음과 같이 선언을 하고 main함수 아래에 정의할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
void printA( int nNum );
void main()
{
    int nNum = 5;
    printA(nNum);
}
 
void printA( int nNum )
{
    printf("printA : %d\n", nNum);
}
cs

 

매개변수 전달

- 매개변수로 값 전달

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int Plus(int nNum1, int nNum2)
{
    return nNum1 + nNum2;
}
 
void main()
{
    int nNum1 = 5;
    int nNum2 = 8;
 
    printf("Plus(%d, %d) : %d", nNum1, nNum2, Plus(nNum1, nNum2));
}
 
cs

Plus함수에 5,8값을 매개변수로 전달해서 덧셈한 후 리턴합니다.

- 매개변수로 주소 전달

매개변수로 값을 전달하고 함수안에서 값을 변경해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int Plus(int nNum1, int nNum2)
{
    nNum1 = 10;
    return nNum1 + nNum2;
}
 
void main()
{
    int nNum1 = 5;
    int nNum2 = 8;
 
    printf("Plus(%d, %d) : %d", nNum1, nNum2, Plus(nNum1, nNum2));
}
 
cs

Plus함수내에서 매개변수를 변경을 하면 덧셈연산 후 리턴값은 변경 되지만, nNum1값은 변경한 10이 아닌 그대로 5입니다.

함수내에서 값을 변경하면 매개변수 값도 변경되게 하려면 어떻게 하면 될까요??

주소값을 매개변수로 전달하면 됩니다.

주소를 나타내는 "&"을 붙여서 매개변수를 전달합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int Plus(int* nNum1, int* nNum2)
{
    *nNum1 = 10;
    return *nNum1 + *nNum2;
}
 
void main()
{
    int nNum1 = 5;
    int nNum2 = 8;
 
    printf("Plus(%d, %d) : %d", nNum1, nNum2, Plus(&nNum1, &nNum2));
}
 
cs

포인터 변수로 주소값으로 매개변수 값을 전달하면 nNum1 값을 5에서 10으로 변경하면 값이 변경되는 것을 확인할 수 있습니다.

반응형
반응형

안녕하세요.

오늘은 포인터에 대해 알아보도록 하겠습니다.

 

포인터

단순히 포인터라는 단어의 뜻만 보면, 무언가를 가리키는 것 정도의 의미가 되는데,

C언어에는 주소 값을 가리키기 위한 형식을 뜻하게 됩니다.

메모리 공간의 주소값을 가리킬 수 있기 때문에 동적 메모리 할당에 많은 이점을 가질 수 있게 됩니다.

형식

데이터타입* 포인터 변수명;

포인터 변수명 = &변수;

*포인터 변수 = 변수;

- 데이터 타입* 포인터 변수명;
데이터 타입에 "*"을 붙이면 포인터 변수가 됩니다.
메모리 공간은 타입에 상관없이 4바이트를 차지하게 됩니다.

- 포인터 변수명 = &변수;
변수에 주소라는 의미인 "&"를 변수 앞에 넣어서 포인터 변수에 주소 값을 대입할 수 있습니다.

- *포인터 변수 = 변수;
포인터 변수를 선언할 때는 "*"가 포인터 변수 타입이라는 것을 나타내지만 대입할 때에는 가리키는 값이라는 코드가 됩니다.
포인터 변수에 일반 변수 값을 대입하기 위해서는 포인트 변수 앞에 "*"를 넣어 변수를 대입합니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void main()
{
    int* p;
    int nNum = 5;
    p = &nNum;                    // nNum의 주소값을 p에 저장합니다.
    printf("*p = %d\n"*p);    // p의 가르키는 값을 출력합니다.
    printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
    printf("==================\n");
    *= 10;                    // p가 가르키는 값 10으로 변경합니다.
    printf("*p = %d\n"*p);    // p의 가르키는 값을 출력합니다.
    printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
    printf("==================\n");
    nNum = 15;
    printf("*p = %d\n"*p);    // p의 가르키는 값을 출력합니다.
    printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
}
 
cs

 

배열과 포인터

배열에 인덱스를 적지 않고 쓴다면 포인터변수와 마찬가지로 사용할 수 있게됩니다.

예제

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
void main()
{
    int arrNum[5= {1,2,3,4,5};
    
    int i;
    for ( i = 0; i < 5; i++ )
        printf("%d\n"*(arrNum+i));
}
cs

코딩 팁

보통은 포인터변수 초기값을 null(널)값으로 설정합니다.

짧은 코드에서는 상관이없지만, 코드가 많아지면 포인터 변수에 주소값을 대입하는걸 깜빡하게 될 수 있어서 체크하는 코드를 넣어야합니다.

다음과 같이 사용합니다.

1
2
3
int* pNum = null; 
if(pNum != null) 
    *pNum = 5;
cs

 

주소 값 변화를 확인하는 방법(VS 2019)

1. F5키 또는 메뉴 - 디버그 - 디버깅 시작을 누릅니다.

2. 메뉴 - 디버그 - 창 - 메모리 - 메모리 로 메모리 창을 엽니다.

다음과 같은 창이 생깁니다.

변수에 "&"를 앞에 넣어서(예를들면 "&nNum")를 주소에 넣고 엔터를 누릅니다.

그럼 해당 변수에 해당되는 주소로 이동합니다.

디버깅하면서 한스탭씩 넘어가는 것(F10)을 확인 합니다.

변수값이 변하면 주소에 해당하는 변수가 변경되는 것을 확인할 수 있습니다.

반응형
반응형

안녕하세요.

오늘은 C언어 반복문에 대해 알아보도록 하겠습니다.

 

반복문

규칙적인 구문을 반복해야할 때에는 반복문을 이용할 수 있습니다.

반복문에는 for문과 while문, do-while문이 있습니다.

 

for 문

구문

1
2
3
4
for(초기식; 조건식; 증감식)
{
    구문;
}
cs

다음과 같은 순서로 반복됩니다.

1. 조건식이 참이면 구문을 실행하니다.

2. 증감식으로 변수를 증감합니다.

3. 1~2를 계속 반복하고 조건식이 거짓이면 for문을 빠져나갑니다.

예제

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
void main()
{
    int i;
    for (i = 1; i <= 5; i++)
    {
        printf("%d\n", i);
    }
}
cs

i값이 1씩 증가하면서 1~5를 출력합니다.

 

while 문

구문

1
2
3
4
while(조건식)
{
    구문;
}
cs

다음과 같은 순서로 반복됩니다.

1. 조건식이 참이면 구문을 실행합니다.

2. 조건식이 거짓이 될 때 까지 반복합니다.

예제

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    int i = 1;
    while ( i <= 5 )
    {
        printf("%d\n", i);
        i++;
    }
}
cs

 

do-while 문

구문

1
2
3
4
do
{
    구문;
}while(조건식)
cs

while과 동일하지만 조건식이 만족하지 않더라도 한번은 구문이 실행됩니다.

 

예제

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    int i = 1;
    do
    {
        printf("%d\n", i);
        i++;
    } while (i > 5);
}
cs

continue

반복문에서 특정 조건일 때는 구문을 실행시키지 않기 위해서는 continue문을 사용할 수 있습니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void main()
{
    int i;
    for (int i = 1; i <= 5; i++)
    {
        if (i == 3)
        {
            continue;
        }
        printf("%d\n", i);
    }
}
cs

i가 3일 때 continue문 다음 구문을 실행하지 않고, 다음 반복문을 실행시킨다.

 

break

반복문에서 break문을 만나면 해당 반복문 밖으로 빠져나오게 됩니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void main()
{
    int i;
    for (int i = 1; i <= 5; i++)
    {
        if (i == 3)
        {
            break;
        }
        printf("%d\n", i);
    }
}
cs

i가 3일때 break문이 실행되면서 for에서 빠져나오게 됩니다.

반응형
반응형

안녕하세요.

오늘은 C언어 조건문에 대해 알아보도록 하겠습니다.

 

조건문

게임에서 HP가 0일떄 쓰러지는 모션을 취해야하거나, 시작지역으로 이동하려면 꼭 조건문의 조건의 만족할 때만 코드가 실행되야 할 것 입니다.

따라서 특정 조건에 따라서 코드가 실행되도록 하기 위해서는 조건문이 필요합니다.

 

if문

문법

1
2
3
4
if(조건)
{
   구문;
}
cs

만약에 조건이 만족하면 구문을 실행한다는 뜻이 됩니다.

조건이 0이면 실행되지 않고, 0 이외의 값을 가지면 실행이 됩니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void main()
{
    if (1)
    {
        printf("Hello!!\n");
    }
 
    if (0)
    {
        printf("World!!\n");
    }
}
cs

"Hello!!"만 출력되고, "World!!"는 출력되지 않게됩니다.

 

if-else문

문법

1
2
3
4
5
6
7
8
if(조건)
{
   구문1;
}
else
{
   구문2;
}
cs

if-else문은 if 조건이 만족할 때에는 구문1을 실행하고 조건이 만족하지 못할 때는 else문에 있는 구문2를 실행하게 됩니다.

구문1, 구문2가 함께 실행되는 경우는 없습니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
void main()
{
    int nNum = 5;
    
    if (nNum >= 5)
    {
        printf("%d >= 5", nNum);
    }
    else
    {
        printf("%d < 5", nNum);
    }
}
 
cs

nNum값이 5이기 때문에 5보다 이상인 조건에 만족하기 때문에 " 5 >= 5"가 출력이 됩니다.

 

if-else if-else문

문법

1
2
3
4
5
6
7
8
9
10
11
12
if(조건1)
{
   구문1;
}
else if(조건2)
{
   구문2;
}
else
{
   구문3;
}
cs

if-else if-else문은 if의 조건1이 만족하지 않으면 else if의 조건2를 확인해서 만족하면 구문2를 실행하고, 조건2도 만족하지 않는다면, 구문3을 실행시킵니다.

만약 else if문을 사용하지 않는다면, if - else문으로 다음과 같이 구현해야함으로 가독성이 떨어질 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if(조건1)
{
   구문1;
}
else
{
    if(조건2)
    {
       구문2;
    }
    else
    {
       구문3;
    }
}
cs

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void main()
{
    int nNum = 15;
    
    if (nNum < 5)
    {
        printf("if %d < 5", nNum);
    }
    else if (nNum > 10)
    {
        printf("else if %d > 5", nNum);
    }
    else
    {
        printf("else %d >= 5 and nNum > 10", nNum);
    }
}
 
cs

nNum가 15이기 때문에 "else if 15 > 5"가 출력이 됩니다.

 

조건 연산자(혹은 삼항 연산자)

간단한 if-else조건문 경우에는 조건 연산자를 이용할 수 있습니다.

문법

조건 ? 구문1 : 구문2;

예제

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
void main()
{
    int nNum = 5;
    
    nNum > 5 ? printf("%d > 5", nNum) : printf("%d <= 5", nNum);
}
 
 
cs

"5 <= 5"가 출력됩니다.

 

if문팁

다음과 같이 if문의 조건에 두가지 혹은 n가지 조건들을 논리연산자(&&, ||, !)로 넣을 수 있습니다.

if( nNum > 5 || nNum < 0 )

이런식으로 구현할 수있습니다.

다음과 같이 데이터를 리턴하는 함수도 넣을 수 있습니다.

if ( func1() && func2() )

위 구문에서 만약에 fun1함수 리턴값이 false값(=0)이라면 func2함수를 호출하지 않습니다.

 

switch-case문

변수값에 따라서 실행구문이 달라진다면 if문 보다 switch-case문이 가독성이 더좋습니다.

문법

1
2
3
4
5
6
7
8
9
switch(변수)
{
    case 상수1:
        break;
    case 상수2:
        break;
    default:
        break;
}
cs

switch문의 변수는 정수만 가능하고(실수형변수는 안됩니다) 변수와 같은 상수를 가진 case문의 구문을 실행하게 됩니다. break문이 없다면 바로 다음 case문을 실행하게 됩니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void main()
{
    int nNum = 5;
    
    switch (nNum)
    {
    case 5:
        printf("nNum 5\n");
        break;
    case 6:
        printf("nNum 6\n");
        break;
    default:
        printf("default\n");
        break;
    }
}
cs

"nNum 5"가 출력됩니다.

다음과 같이 case 5에 break;문이 없다면 어떻게 될까요??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void main()
{
    int nNum = 5;
    
    switch (nNum)
    {
    case 5:
        printf("nNum 5\n");
    case 6:
        printf("nNum 6\n");
        break;
    default:
        printf("default\n");
        break;
    }
}
cs

break문이 없다면 바로 다음구문으로 실행되어 "nNum 5"과 "nNum 6"가 출력됩니다.

switch-case문은 해당 구문으로 이동되면서 작동되는 것을 확인할 수 있습니다.

반응형
반응형

안녕하세요.

오늘은 C언어의 연산자에 대해 알아보도록 하겠습니다.

 

연산자

수나 식을 일정한 규칙에 의해 계산하기 위해서 연산자를 사용합니다.

 

산술 연산자

1. 이항연산자

피연산자를 덧셈, 뺼셈, 곱셈, 나눗셈, 나머지 연산을 말합니다.

연산자 설명 사용
+ 더하기 A+B
- 빼기 A-B
* 곱하기 A*B
/ 나누기 A/B
% 나머지 A%B

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
void main()
{
    int num1 = 50;
    int num2 = 6;
 
    printf("num1 + num2 : %d\n", num1 + num2);
    printf("num1 - num2 : %d\n", num1 - num2);
    printf("num1 * num2 : %d\n", num1 * num2);
    printf("num1 / num2 : %f\n", (float)num1 / (float)num2); // 소수점 출력을 위해서 float로 강제 형변환합니다.
    printf("num1 %% num2 : %d\n", num1 % num2);
}
cs

2. 단항 연산자

피연산자에 증가(++),감소(--)와 양수(+),음수(-)를 표시하는 연산자입니다.

연산자 설명 사용
+ 양수표현 +A
- 음수표현 -A
++ 1씩증가 A++, ++A
-- 1씩감소 A--, --A

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
void main()
{
    int num = 50;
 
    printf("num : %d\n", num);
    printf("-num : %d\n"-num);
    printf("num++ : %d\n", num++);    // 다음 코드에서 1증가
    printf("++num : %d\n"++num);    // 현재 코드에서 1증가
    printf("num-- : %d\n", num--);    // 다음 코드에서 1감소
    printf("--num : %d\n"--num);    // 현재 코드에서 1감소
}
 
cs

3. 대입 연산자

오른쪽 식을 왼쪽값에 대입합니다.

연산자 설명 사용
= 오른쪽 식을 왼쪽 값에 대입 C = A + B

복합 산술연산자 ( 이항연산자와 대입연산자를 같이 사용)

연산자 설명 사용
+= 왼쪽 수에 오른쪽 수 더해 왼쪽 수에 대입 A += B (A = A + B)
-= 왼쪽 수에 오른쪽 수 빼기를 해 왼쪽 수에 대입 A -= B (A = A - B)
*= 왼쪽 수에 오른쪽 수 곱해서 왼쪽 수에 대입 A *= B (A = A * B)
/= 왼쪽 수에 오른쪽 수 나누어 왼쪽 수에 대입 A /= B (A = A / B)
%= 왼쪽 수에 오른쪽 수 나눈 나머지를 왼쪽 수에 대입 A %= B (A = A % B)

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void main()
{
    int num = 10;
 
    printf("num : %d\n", num);
    num += 6;    // num = num + 6
    printf("num : %d\n", num);
    num -= 8;    // num = num - 8
    printf("num : %d\n", num);
    num *= 4;    // num = num * 4
    printf("num : %d\n", num);
    num /= 2;    // num = num / 2
    printf("num : %d\n", num);
    num %= 2;    // num = num % 3
    printf("num : %d\n", num);
}
cs

비교 연산자(혹은 관계 연산자)

왼쪽값과 오른쪽 값을 비교합니다.

연산자 설명 사용
< 오른쪽 값이 왼쪽 값보다 클 때 1, 아니면 0 A < B
> 왼쪽 값이 오른쪽 값보다 클 때 1, 아니면 0 A > B
<= 오른쪽 값이 왼쪽 값보다 같거나 클 때 1, 아니면 0 A <= B
>= 왼쪽 값이 오른쪽 값보다 같거나 클 때 1, 아니면 0 A >= B
== 왼쪽 값과 오른쪽 값이 같을 때 1, 아니면 0 A == B
!= 왼쪽 값과 오른쪽 값이 다를 때 1, 아니면 0 A != B

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void main()
{
    int num1 = 10;
    int num2 = 15;
 
    printf("num1 < num2 : %d\n", num1 < num2);
    printf("num1 > num2 : %d\n", num1 > num2);
    printf("num1 <= num2 : %d\n", num1 <= num2);
    printf("num1 >= num2 : %d\n", num1 >= num2);
    printf("num1 == num2 : %d\n", num1 == num2);
    printf("num1 != num2 : %d\n", num1 != num2);
}
 
cs

 

논리 연산자

왼쪽과 오른쪽을 논리연산(AND, OR, NOT)합니다.

연산자 설명 사용
&& 왼쪽과 오른쪽 논리값이 모두 1일 때 1 (AND 연산) A && B
|| 왼쪽과 오른쪽 논리값이 하나라도 1일 때 1 (OR 연산) A > B
! 논리값이 0이면 1, 1이면 0 !A

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
void main()
{
    int num1 = 1;
    int num2 = 1;
 
    printf("num1 && num2 : %d\n", num1 && num2);
    printf("num1 || num2 : %d\n", num1 || num2);
    num1 = 1;
    num2 = 0;
    printf("num1 && num2 : %d\n", num1 && num2);
    printf("num1 || num2 : %d\n", num1 || num2);
 
    printf("!num1 : %d\n"!num1);
}
 
cs

 

비트 연산자

비트(2진수) 연산을 위해서는 비트 연산자를 사용합니다.

연산자 설명 사용
& 비트(2진수)단위 AND 연산 A & B
| 비트(2진수)단위 OR 연산 A | B
~ 비트(2진수)단위 NOT 연산 ~A
^ 비트(2진수)단위 XOR 연산 A ^ B
<< 왼쪽으로 비트 이동 A << B
>> 오른쪽으로 비트 이동 A >> B

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
 
void main()
{
    int num1 = 14;
    int num2 = 7;
 
    // num1      1110
    // num2  AND 0111
    //           0110 
    printf("num1 & num2 : %d\n", num1 & num2);
    // num1      1110
    // num2  OR  0111
    //           1111
    printf("num1 | num2 : %d\n", num1 | num2);
    
    // num1      NOT 1110 ->  ‭1111 1111 1111 1111 1111 1111 1111 0001‬
    printf("num1 : %d\n", ~num1);
    
    printf("11111num1 : %d\n", num1);
 
    // num1       1110
    // num2  XOR  0111
    //            1001
    printf("num1 ^ num2 : %d\n", num1 ^ num2);
 
    // 1110 >> 2 -> 0011
    printf("num1 >> 2 : %d\n", num1 >> 2);
    // 1110 << 2 -> 11 1000
    printf("num1 << 2 : %d\n", num1 << 2);
}
 
cs

 

포인터 연산자

변수가 참조하는 주소값과 포인터 변수가 가르키는 값을 얻기 위해 사용합니다.

연산자 설명 사용
& 변수의 주소값 &A
* 포인터 변수의 가르키는 값 *A

예제

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    int num = 10;
    int* p = &num;
    
    printf("&num: %p\n"&num);
    num = 5;
    printf("*p: %d\n"*p);
}
cs

 

조건 연산자(혹은 삼항 연산자)

조건식으로 참 / 거짓에 따라 수식을 실행합니다.

연산자 설명 사용
조건식 ? 식1 : 식2 조건식이 참이면 식1이 적용, 거짓이면 식2 적용 A < B ? A = 5 : B = 10

예제

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    int num1 = 14;
    int num2 = 7;
    (num1 < num2) ? (num1 = 5) : (num1 = 10);
 
    printf("num1: %d\n", num1);
    
}
 
cs

 

반응형
반응형

안녕하세요.

오늘은 변수에 데이터를 입력과 출력에 대해 알아보도록 하겠습니다.

 

출력

데이터를 출력하기 위해서는 "printf"라는 함수를 사용합니다.

형식

printf("서식", 데이터);

서식은 다음과 같이 넣을 수 있습니다.

서식 데이터 타입 비고
%d int 부호 있는 10진수 정수
%u unsigned int 부호 없는 10진수 정수
%o int 8진수
%x int 16진수 정수 소문자
%X int 16진수 정수 대문자
%f float 실수
%lf double 실수
%e float, double 부동소수점 e(소문자) 방식 실수
%E float, double 부동소수점 E(대문자) 방식 실수
%c char 문자
%s,%S char*, char[] 문자열
%p void* 포인트형

데이터에는 변수 혹은 상수를 넣어서 출력을 합니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
void main()
{
    int nNum = -10;
    float fNum = 12345.6789123f;
    double dbNum = 89789.123456f;
    char ch = 'H';
    char chString[20= "Hello World";
 
    printf("%%d %d\n", nNum);
    printf("%%u %u\n", nNum);
    printf("%%o %o\n", nNum);
    printf("%%x %x\n", nNum);
    printf("%%X %X\n", nNum);
    printf("%%f %f\n", fNum);
    printf("%%lf %lf\n", dbNum);
    printf("%%e %e\n", dbNum);
    printf("%%E %E\n", dbNum);
    printf("%%c %c\n", ch);
    printf("%%s %s\n", chString);
 
}
 
cs

 

 

입력

데이터를 입력받기 위해서는 "scanf"라는 함수를 사용합니다.

※ Visual Studio 사용시 
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.
이런 에러가 발생한다면 다음과 같이 하면 됩니다.

1. scanf대신 scanf_s를 사용합니다.

2. "#define _CRT_SECURE_NO_WARNINGS" 추가합니다.

 

형식

scanf("서식", &변수(변수주소));

서식은 다음과 같이 넣을 수 있습니다.

서식 데이터 타입 비고
%d int 부호 있는 10진수 정수
%u unsigned int 부호 없는 10진수 정수
%o int 8진수
%x int 16진수 정수 소문자
%f float 실수
%lf double 실수
%e float 부동소수점 e방식 실수
%c char 문자
%s,%S char*, char[] 문자열

변수는 scanf 함수는 서식에 맞춰서 변수주소로 접근해서 데이터를 입력을 합니다.

그로인해 변수앞에 변수의 주소값을 지칭하는 "&"를 추가합니다.

 

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
void main()
{
    int nNum1, nNum2, nNum3, nNum4;
    float fNum1, fNum2;
    double dbNum;
    char ch = 'H';
    char chString[20= "Hello World";
 
    
    printf("%%d : ");
    scanf("%d"&nNum1);
    while (getchar() != '\n');
 
    printf("%%u : ");
    scanf("%u"&nNum2);
    while (getchar() != '\n');
 
    printf("%%o : ");
    scanf("%o"&nNum3);
    while (getchar() != '\n');
 
    printf("%%x : ");
    scanf("%x"&nNum4);
    while (getchar() != '\n');
 
    printf("%%f : ");
    scanf("%f"&fNum1);
    while (getchar() != '\n');
 
    printf("%%lf : ");
    scanf("%lf"&dbNum);
    while (getchar() != '\n');
 
    printf("%%e : ");
    scanf("%e"&fNum2);
    while (getchar() != '\n');
 
    printf("%%c : ");
    scanf("%c"&ch);
    while (getchar() != '\n');
 
    printf("%%s : ");
    scanf("%s", chString); // 문자열은 chString 변수 자체가 주소이기 때문에 &를 제외합니다.
 
    printf("%%d %d\n", nNum1);
    printf("%%u %u\n", nNum2);
    printf("%%o %o\n", nNum3);
    printf("%%x %x\n", nNum4);
    printf("%%f %f\n", fNum1);
    printf("%%lf %lf\n", dbNum);
    printf("%%e %e\n", fNum2);
    printf("%%c %c\n", ch);
    printf("%%s %s\n", chString);
}
 
cs

 

※ "while (getchar() != '\n');" 코드 추가가 되는 이유

다음과 같이 입력후 엔터를 눌렀을 때 개행문자(\n)가 입력될 수 있기 때문에 추가합니다.

 

반응형
반응형

안녕하세요.

오늘은 저번 주에 변수와 상수에 이어서 배열에 대해 알아보도록 하겠습니다.

 

배열이란??

int형 변수 10개를 선언은 다음과 같이 할 수 있습니다.

int nNum1, nNum2, nNum3, nNum5, nNum6, nNum7, nNum8, nNum9, nNum10;

100개나 1000개를 선언하려면 하나씩 적기도 너무 번거롭고 관리도 어렵습니다.

이때 사용할 수 있는 게 배열입니다.

배열을 사용하게 되면 여러 개의 데이터를 수월하게 관리할 수 있게 됩니다.

형식

다음과 같이 초기화 하면서 배열 초기값을 넣을 수 있습니다.

데이터형 변수명[크기] = {배열1초기값, 배열2초기값, 배열3초기값...};

다른 방법으로 다음과 같이 초기화한 후 배열 값을 대입할 수도 있습니다.

데이터형 변수명[크기];

변수명[0] = 배열값;

변수명[1] = 배열 값;

 

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
void main()
{
    int arrNum[10];
 
    arrNum[0= 1;
    arrNum[1= 2;
    arrNum[2= 3;
    arrNum[3= 4;
    arrNum[4= 5;
    arrNum[5= 6;
    arrNum[6= 7;
    arrNum[7= 8;
    arrNum[8= 9;
    arrNum[9= 10;
 
    printf("arrNum[0] : %d\n", arrNum[0]);
    printf("arrNum[1] : %d\n", arrNum[1]);
    printf("arrNum[2] : %d\n", arrNum[2]);
    printf("arrNum[3] : %d\n", arrNum[3]);
    printf("arrNum[4] : %d\n", arrNum[4]);
    printf("arrNum[5] : %d\n", arrNum[5]);
    printf("arrNum[6] : %d\n", arrNum[6]);
    printf("arrNum[7] : %d\n", arrNum[7]);
    printf("arrNum[8] : %d\n", arrNum[8]);
    printf("arrNum[9] : %d\n", arrNum[9]);
}
 
cs

 

배열을 선언에 준 후 배열 값 0~9로 접근합니다.

그리고 배열을 "int arrNum[10];"으로 선언하면 메모리상에 연속으로 할당이 되게 됩니다.

 

 

다차원 배열

행, 열을 가진 데이터를 배열에 넣기 위해서는 다차원 배열을 이용할 수 있습니다.

예를 들면 학생들의 영어, 수학, 과학 성적을 배열에 넣는 경우에는 2차원 배열을 사용해서 넣을 수 있습니다.

형식

데이터형 변수명[행개수][열개수] = {배열1초기값, 배열2초기값, 배열3초기값...};

데이터형 변수명[행 개수][열개수];[행개수][열개수];

변수명[0][0] = 배열 값;

변수명[0][1] =배열 값;

변수명[1][0] = 배열 값;

변수명[1][1] = 배열 값;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
 
void main()
{
    int arrNum[2][5];
 
    arrNum[0][0= 1;
    arrNum[0][1= 2;
    arrNum[0][2= 3;
    arrNum[0][3= 4;
    arrNum[0][4= 5;
    arrNum[1][0= 6;
    arrNum[1][1= 7;
    arrNum[1][2= 8;
    arrNum[1][3= 9;
    arrNum[1][4= 10;
    
 
    printf("arrNum[0][0] : %d\n", arrNum[0][0]);
    printf("arrNum[0][1] : %d\n", arrNum[0][1]);
    printf("arrNum[0][2] : %d\n", arrNum[0][2]);
    printf("arrNum[0][3] : %d\n", arrNum[0][3]);
    printf("arrNum[0][4] : %d\n", arrNum[0][4]);
    printf("arrNum[1][0] : %d\n", arrNum[1][0]);
    printf("arrNum[1][1] : %d\n", arrNum[1][1]);
    printf("arrNum[1][2] : %d\n", arrNum[1][2]);
    printf("arrNum[1][3] : %d\n", arrNum[1][3]);
    printf("arrNum[1][4] : %d\n", arrNum[1][4]);
}
 
cs

 

"int arrNum[2][5];"은 메모리상에는 다음과 같이 할당됩니다.

 

반응형
반응형

안녕하세요.

오늘은 변수와 상수에 대해 알아보도록 하겠습니다.

 

변수

숫자나 문자의 값들을 메모리에 넣어서 사용하기 위해서는 변수를 이용합니다.

형식

변수 초기값을 넣으려면 다음과 같이 합니다.

자료형 변수명 = 초기값;

초기값을 없이 변수를 선언 할 수 도 있습니다.

자료형 변수명;

 

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
 
void main()
    int nNum = 5;           // 정수 5를 int형(정수형) nNum에 대입합니다.
    char cCh = 'A';         // 문자 'A'를 char형(문자형) cCh에 대입합니다.
    int nNum1, nNum2;       // 변수 2개를 한번에 선언할 수 있습니다.
    float fNum3 = 4.8f;     // 실수 4.8을 float형(실수형) fNum3에 대입합니다.
    nNum1 = 15;
    nNum2 = 7;
 
    printf("nNum = %d\n", nNum);
    printf("cCh = %c\n", cCh);
    printf("nNum1 = %d\n", nNum1);
    printf("nNum2 = %d\n", nNum2);
    printf("fNum3 = %f\n", fNum3);
}
 
cs

자료형(Data Type)

 

변수명의 규칙

1. 알파벳(대소문자 구분), 숫자(첫글자에는 쓸수없음)로 선언합니다.

2. 공백을 사용할 수 없습니다.

3. 예약어(Keyword)를 사용할 수 없습니다.

4. 특수문자는 "_"만사용할 수 있습니다.

 

상수

상수에는 리터럴 상수와 심볼릭 상수가 있습니다.

리터럴 상수

1, 5 등과 같이 바로 넣어서 사용할 수 있는 상수를 말합니다.

심볼릭 상수

변하지 않는 변수를 말합니다.

const, #define을 사용하여 선언합니다.(const는 자료형이 있고, #define은 자료형이 없습니다)

보통 대문자를 사용하여 선언하게 됩니다.

형식

const int MAX_LEVEL 100;

#define MAX_SIZE 50

 

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
#define MAX_SIZE 50
 
void main()
{
    const int MAX_LEVEL = 100;
    const float HALF = 0.5f;
 
    printf("MAX_SIZE = %d\n", MAX_SIZE);
    printf("MAX_LEVEL = %d\n", MAX_LEVEL);
    printf("HALF = %f\n", HALF);
}
 
cs

 

반응형
반응형

안녕하세요.

오늘은 저번 시간에 간단하게 알아본 Hello World를 출력하는 프로그램을 이용하여, 

C언어의 기본 구조를 이해해보도록 하겠습니다.

아래는 저번시간에 만든 Hello World 출력 프로그램의 코드입니다.

하나하나 코드를 분석해보도록 하겠습니다.

1
2
3
4
5
6
7
#include <stdio.h>
 
void main()
    // Hello World를 출력합니다.
    printf("Hello World");
}
cs

 

#include <stdio.h>

stdio.h라는 파일을 포함하겠다는 뜻입니다.

stdio.h는 Standard Input/Output library의 약어로 여러형의 입출력 함수가 포함된 헤더파일입니다.

C언어로 코딩할때 항상 필요한 라이브러리 입니다.

 

void main()

C언어는 main이라는 함수부터 시작됩니다.

항상 시작점은 main함수입니다.

함수는 보통 리턴값을 가지게 되는데 void를 사용하면 반환값이 필요없습니다.

 

// Hello World를 출력합니다.

코드에 대한 설명을 하기 위해서는 "//" 이나 "/* */"을 사용할 수 있습니다. 

 

printf("Hello World");

printf함수는 문자열을 출력해주는 함수입니다.

모든 명령은 ";"(세미콜론)으로 끝냅니다.

 

반응형
반응형

안녕하세요.

오늘은 C언어에 대해 간단히 알아본 뒤 가장 간단한 프로그램인 Hello World를 출력하는 프로그램을 만들어 보도록 하겠습니다.

 

C언어란??

1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 유닉스 운영 체제에서 사용하기 위하여 개발한 프로그래밍 언어가 C언어입니다.

많은 프로그래밍 언어에 기반에 되는 언어입니다, 

다른 언어들보다는 조금 어렵게 느껴질 수 있으나, C언어를 배우면 다른 언어를 배우기 조금더 수월하다고 생각이 듭니다.

절차적 프로그래밍 언어입니다.

 

개발툴 설치

C언어로 만든 코드를 컴파일할 수 있는 컴파일러가 필요합니다.

Dev-C++이나 Visual Studio(이하 VS)가 필요합니다.

다음 링크를 참조해주세요.

Dev-C++ 다운로드 & 설치

Visual Studio 2019 다운로드 및 설치

저는 아무래도 VS가 익숙하기 때문에 VS를 사용하여 강좌를 진행하도록 하겠습니다.

 

VS를 이용한 Hello World를 출력하는 프로그램 만들기

 

1. 설치한 VS를 실행합니다.

2. 새 프로젝트 만들기를 선택합니다.

3. 빈 프로젝트를 선택한 후 다음을 누릅니다.

4. 프로젝트이름을 적고, 저장될 경로를 지정합니다. 그 후 만들기 버튼을 누릅니다.

5. 프로젝트를 만들었으니, 이제는 코드를 입력할 파일을 만들겠습니다.

솔루션 탐색기에 소스 파일에 오른쪽 클릭 한 후 추가 - 새 항목을 선택합니다.

C++ 파일을 선택한 후 파일이름을 변경하고 난 뒤에 추가 버튼을 누릅니다.

8. Hello World를 출력하는 코드를 작성합니다.

1
2
3
4
5
6
#include <stdio.h>
 
void main()
{
    printf("Hello World");
}
cs

9. 컴파일을 합니다.

메뉴 - 빌드 - 컴파일을 누릅니다.(Ctrl+F7)

10. 빌드를 합니다.

메뉴 - 빌드 - HelloWorld빌드를 선택합니다.

11. 실행을 합니다.

메뉴 - 디버그 - 디버그하지 않고 시작을 누릅니다.

Ctrl+F5를 해도 됩니다.

사실 9(컴파일), 10(빌드)과정을 제외하고 바로 Ctrl+F5키를 누르면 빌드를 한 후 실행을 하게 됩니다.

반응형
반응형

안녕하세요

Dev C++설치 한 후 Hello World프로젝트를 만들어보도록 하겠습니다.

Hello World 프로젝트 만들기

1. 메뉴 - 파일 - 새로 만들기 - 프로젝트로 프로젝트를 추가합니다.

2. Console Application을 선택한 후 프로젝트명을 입력하고 확인을 누릅니다.

3. 프로젝트가 저장될 경로를 지정한 후 저장버튼을 누릅니다.

4. 기본적으로 cpp파일 생성된 후 프로젝트가 추가되었습니다.

 

실행이 제대로 되는지 확인 하기 위해서

cout >> "Hello World"; 

이 코드를 추가하여 "Hello World"가 출력되도록 해보겠습니다.

전체 코드는 다음과 같습니다.

1
2
3
4
5
6
7
#include <iostream>
 
 
int main(int argc, char** argv) {
    std::cout << "Hello World";    // 추가 
    return 0;
}
cs

 

5. 그 후 "F10" 키를 누르거나, 메뉴 - 실행- 실행으로 프로그램을 실행시킵니다.

컴파일을 하지 않고 바로 실행을 하여 메세지 박스가 뜹니다.

"Yes"버튼을 누릅니다.

cpp파일을 저장합니다.

 

7. 컴파일에 문제가 없다면 실행이 됩니다.

반응형
반응형

안녕하세요

C나 C++을 실제 컴파일해서 실행해보려면 컴파일러가 필요한데요.

아무래도, Visual Studio는 설치하려면 용량이 조금 무겁기 때문에, 그런 이유로 사용이 꺼려진다면, Dev C++을 추천합니다.

Dev C++란

GNU 라이선스로 보급되는 C/C++ 통합 개발 환경입니다.

통합 개발 환경은 델파이로 작성되어있습니다.

윈도우에서 사용가능합니다.

 

Dev C++ 설치

Dev C++를 하려면 다음 사이트에 접속합니다.

https://sourceforge.net/projects/orwelldevcpp/

 

Dev-C++

Download Dev-C++ for free. A free, portable, fast and simple C/C++ IDE. A new and improved fork of Bloodshed Dev-C++

sourceforge.net

 

접속 후 다운로드 버튼을 눌러서 설치 파일을 받습니다.

설치파일을 실행합니다.

언어를 선택합니다. 기본적으로 "Korean"으로 되어있습니다.

"OK"버튼을 눌러 다음으로 넘어갑니다.

"동의함" 버튼을 누릅니다.

구성 요소 선택입니다.

따로 설정할것이 없다면, 다음 버튼을 누릅니다.

경로를 설정한 후 설치 버튼을 누릅니다..

설치가 됩니다.

 

잠시 기다리면 설치가 완료됩니다.

마침을 눌러서 실행시킵니다.

이제 Dev C++을 실행합니다.

언어를 설정한 후 Next버튼을 누릅니다.

 

테마설정을 한 후 Next버튼을 누릅니다.

구성설정이 완료되었습니다.

 

 

반응형

+ Recent posts