사이먼's 코딩노트
[C언어] define / typedef / 문자 배열 본문
[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 |