배열은 동일한 데이터형(int, char 등)을 가진 데이터들이 메모리에 순서대로 나열되어 있는 것을 말합니다.
배열의 선언은 아래와 같이 할 수 있습니다.
자료형 변수명[배열크기];
int num[10];
배열의 이해가 제대로 되어야 문자열을 제대로 이해할 수 있으니 여기서는 문자열이란 문자의 연속이고, 입출력함수로 표현을 할 용도로만 이해하고 넘어가면 좋을 것 같습니다.
3) \0(널 문자)
문자열(char 형 배열)의 끝을 의미합니다.
따라서 문자열의 끝을 알리기 위해서는 반드시 널 문자가 포함되어야 합니다.
4) 사용방법
선언과 동시에 초기화하는 경우
char name1[] = "Alice";
> 이 경우 배열의 크기를 명시하지 않아도 문자열의 크기를 자동으로 계산합니다.
입력으로 초기화하는 경우
char name2[20];
scanf("%s", name2);
> 이 경우 입력 문자열의 크기보다 크게 배열의 크기를 명시해주어야 합니다.
2. printf()
1) 의미
어떤 데이터를 출력하기 위한 함수
2) 변환 지정자
printf() 함수는 int(정수형), float(부동소수점형), char(문자형) 등 여러가지 데이터를 변환 지정자를 통해 구분하고, 이를 출력합니다.
변환 지정자
출력 데이터형
%c
문자
%d
부호 있는 10진수
%u
부호 없는 10진수
%o
부호 없는 8진수
%x
부호 없는 16진수
%s
문자열
2.1) 변환 지정자 사용구조
printf() 는 출력될 문자들과 변환 지정자 및 변수의 조합으로 사용됩니다.
int age = 40; // 정수형 변수
printf("My age is %d", age); // 출력될 문자들과 변환 지정자 및 변수
2.2) 변환 지정자 예(test.c)
#include <stdio.h>
int main(void)
{
char ch = 'A';
int num = 100;
unsigned int unum = 3000000000;
int oct = 10;
int hex = 255;
char str[] = "Hello C";
// %c : 문자 출력
printf("%%c : %c\n", ch);
// %d : 부호 있는 10진수 정수 출력
printf("%%d : %d\n", num);
// %u : 부호 없는 10진수 정수 출력
printf("%%u : %u\n", unum);
// %o : 8진수 출력
printf("%%o : %o\n", oct);
// %x : 16진수 출력 (소문자)
printf("%%x : %x\n", hex);
// %s : 문자열 출력
printf("%%s : %s\n", str);
return 0;
}
3) 변경자
변경자를 통해 기본적인 변환 지정을 변경할 수 있습니다.
변경자
의미
-n (플래그)
왼쪽 정렬
%nd
숫자들(n 열 만큼 너비를 설정하고, 빈 자리는 0 으로 채움)
%.nf
부동소수점 최소자릿수(n 개 만큼 소수를 표시)
%n.f
부동소수점들(n 열 만큼 너비를 설정하고, 빈 자리는 0 으로 채움)
%n.nf
위 두 개의 조합
3.1) 변경자 예(test2.c)
#include <stdio.h>
int main(void)
{
int num = 8;
float dec = 0.314;
// 왼쪽 정렬
printf("%%-10d : %-10d|\n", num);
printf("%%-10.3f : %-10.3f|\n", dec);
// %nd : 숫자들
printf("%%2d : %2d|\n", num);
printf("%%5d : %5d|\n", num);
// %.nf : 부동소수점수 최소자릿수
printf("%%.3f : %.3f\n", dec);
// %nf : 부동소수점수들
printf("%%5f : %5.f|\n", dec);
// %n.nf : 위 두개의 조합
printf("%%5.3f : %5.3f|\n", dec);
return 0;
}
3. scanf()
1) 의미
어떤 데이터를 입력하기 위한 함수입니다.
printf() 처럼 다양한 포맷과 연결된 변환 지정자를 통해 데이터를 입력받습니다.
2) 사용방법
데이터를 저장할 변수 앞에는 & 키워드를 넣어 사용합니다.
데이터를 저장할 변수가 배열이라면 & 키워드를 넣지 않습니다.
int num;
scanf("%d", &num);
3) 형식 지정자
형식
의미
%d
int
%u
unsigned int
%f
float
%lf
double
%c
char
%s
문자열
4) 공백 / 엔터 무시
%d(int), %f(float), %s(문자열)는 자동으로 공백/엔터를 입력의 끝으로 인지합니다.
특히 %s(문자열)는 공백이 포함되면 공백 전 내용만을 문자열로 인식하는 문제점이 있습니다.
5) 공백 / 엔터 입력
%c 는 공백/엔터도 유효한 문자로 입력받습니다.
이를 해결하기 위해 %c 앞 공백을 두게되면 이전에 입력된 엔터를 무시할 수 있습니다.
5) 실제 예(test3.c)
#include <stdio.h>
int main(void)
{
// 변수 선언
int num;
unsigned int unum;
float fnum;
double dnum;
char ch;
char str[100];
// -----------------------------
// 1. %d : int 입력
// -----------------------------
printf("정수 입력(%%d) : ");
scanf("%d", &num);
// -----------------------------
// 2. %u : unsigned int 입력
// -----------------------------
printf("양의 정수 입력(%%u) : ");
scanf("%u", &unum);
// -----------------------------
// 3. %f : float 입력
// -----------------------------
printf("float 입력(%%f) : ");
scanf("%f", &fnum);
// -----------------------------
// 4. %lf : double 입력
// -----------------------------
printf("double 입력(%%lf) : ");
scanf("%lf", &dnum);
// -----------------------------
// 5. %c : 문자 입력
// -----------------------------
printf("문자 입력(%%c) : ");
scanf(" %c", &ch);
// -----------------------------
// 6. %s : 문자열 입력
// -----------------------------
printf("문자열 입력(%%s) : ");
scanf("%s", str);
// 결과 출력
printf("\n===== 결과 =====\n");
printf("%%d : %d\n", num);
printf("%%u : %u\n", unum);
printf("%%f : %f\n", fnum);
printf("%%lf : %lf\n", dnum);
printf("%%c : %c\n", ch);
printf("%%s : %s\n", str);
return 0;
}
> 여기서 %c 의 경우 %lf 에서 입력 후 엔터를 공백으로 무시한 걸 알 수 있습니다.
> 여기서 %s 의 경우 "안녕하세요? ㅎㅎ" 로 공백을 포함하고 있습니다. 따라서 결과출력 시 "안녕하세요?" 만 출력되는 것을 알 수 있습니다.
+) VSCode 의 터미널이 PowerShell 인 경우 간혹 한글이 터미널 상에서 깨져보일 수 있습니다.