사이먼's 코딩노트

[C언어] define / typedef / 문자 배열 본문

C언어

[C언어] define / typedef / 문자 배열

simonpark817 2024. 2. 19. 12:54

[define과 typedef]

  • C언어에는 헤더파일을 포함하는 #include 외에 사용자가 임의로 프로그램 내에서 정의할 수 있는 #define이 있다.
  • 또한 C언어에는 각 자료형 타입을 사용자가 임의로 정의할 수 있는 typedef가 있다.
  • 아래는 #define과 typedef를 이용해 boolean이라는 타입이 없는 C언어에서 true, false를 사용할 수 있는 코드이다.
#include <stdio.h>

#define false 0
#define true 1

typedef int bool;

int main(void) {
    bool is_even = false;

    while ( is_even ) {  }
    while ( false ) {  }

    while ( true ) {
        printf("true는 1 이다.\n");
        break;
    }

    while ( is_even == false ) {
        printf("is_even 0 이다.\n");
        break;
    }

    return 0;
}
  • C언어에는 boolean이라는 타입이 따로 없이 정수 1과 0으로 참, 거짓을 구분한다.
  • 위 코드에서는 1과 0 대신 true와 false를 이용하여 참, 거짓을 구분하기 위해서 define과 typedef를 사용하였다.
  • #define false 0은 0을 false로 정의하겠다 라는 뜻이다.
  • #define true 1은 1을 true로 정의하겠다 라는 뜻이다.
  • typedef int bool은 bool 타입이라는 것을 새로 정의하고 int 타입과 동일하다 라는 뜻이다.
  • #define은 #include와 마찬가지로 끝에 세미콜론(;)을 붙히지 않는다.
  • typedef는 끝에 세미콜론(;)을 붙힌다.

 

[문자 배열]

  • 여지껏 배열을 선언하고 각 배열에 주소를 찾아가 정수 값을 넣는 문제들을 많이 보았다.
  • 이번엔 각 배열에 문자를 넣어 저장하고 문자열을 출력하는 방법을 살펴보자.
  • C언어에서 모든 문장은 '\0' (널문자)로 끝이 나야한다.
  • 출력문을 통해 문자를 출력할 때는 서식지정자를 %c를 사용하지만 문자열을 출력할 때는 %s를 사용한다.
  • 아래는 문자배열을 만들고 거기에 문장 'abc'를 저장하고 문장을 출력하는 코드이다.
#include <stdio.h>

int main(void) {
    char arr[10];

    arr[0] = 'a';
    arr[1] = 'b';
    arr[2] = 'c';
    arr[3] = '\0';

    printf("%c%c%c\n", arr[0], arr[1], arr[2]);
    // 출력 => abc

    // %s : 문장으로 출력한다.
    printf("%s\n", arr);
    // 출력 => abc

    // %s : 문장으로 출력한다.
    printf("%s\n", &arr[0]);
    // 출력 => abc

    return 0;
}
  • 위 코드처럼 크기가 10인 배열을 생성하여 0번째부터 a, b, c를 차례로 저장하고 마지막에 '\0'을 넣었다.
  • 3가지의 방법으로 출력문을 통해 출력했을 때 모두 abc라는 문장이 출력된다.

 

[문제]

  • print_str라는 함수를 통해 str1과 str2를 출력했을 때 'abc', 'hello c'를 출력하게 하세요.
  • 조건은 서식지정자 %s를 사용하지 않는 것입니다.
#include <stdio.h>

void print_str(char* p) {
    // printf("%s\n", p);
    for(int i = 0; 1; i++) {
        if(p[i] == '\0'){
            break;
        }
        printf("%c", p[i]);
    }
    printf("\n");
}

int main(void) {
    char str1[10];
    str1[0] = 'a';
    str1[1] = 'b';
    str1[2] = 'c';
    str1[3] = '\0';

    // print_str 함수를 활용하여 문장 str1 출력 실행
    print_str(str1);
    // 출력 => abc

    char str2[10];
    str2[0] = 'h';
    str2[1] = 'e';
    str2[2] = 'l';
    str2[3] = 'l';
    str2[4] = 'o';
    str2[5] = ' ';
    str2[6] = 'c';
    str2[7] = '\0';

    // print_str 함수를 활용하여 문장 str2 출력 실행
    print_str(str2);
    // 출력 => hello c

    return 0;
}
  • str1, str2 배열의 크기는 모두 10바이트이다. str1은 그 중 널문자를 포함하여 4바이트를 사용하고 str2는 널문자를 포함하여 8바이트를 사용한다.
  • 조건에 맞춰 %s로 한 번에 문장을 출력하지 않고 %c를 사용하여 문자 하나씩 출력하는 방법이 있다.
  • print_str() 라는 함수를 생성하고 매개변수로서는 배열의 첫 번째 주소값을 받기 때문에 char* p 를 받는다.
  • p는 배열 포인터 변수이기 때문에 p[]을 통해 각 배열의 주소로 이동하여 문자를 얻을 수 있다.
  • 총 크기 10바이트의 모든 문자를 출력하지 않고 저장된 문자만큼만 출력하기 위해선 반복문을 사용하여 '\0'이 발견될 때 까지 출력을 계속해준다.
  • for(int i = 0; 1; i++) 를 통해 무한반복을 하고, p[i] == '\0'; 가 성립되면 해당 반복문을 종료시키고, 그렇지 않으면 각 배열의 주소에 담긴 문자를 하나씩 출력한다.
반응형

'C언어' 카테고리의 다른 글

[C언어] 포인터&배열 문제풀이(1)  (0) 2024.02.19
[C언어] 공공재 / strcpy  (0) 2024.02.19
[C언어] scanf  (0) 2024.02.14
[C언어] 배열  (2) 2024.02.08
[C언어] 다중 포인터  (0) 2024.02.06