C언어 공부 2
printf, scanf, 변수, 상수 등을 배운다
C언어 공부 2
Printf, Scanf
printf() 함수는 출력을 한다. Scanf() 함수는 입력을 받는다.
공부내용 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h> // #include = 전처리기 지시문 (preprocessor directive) -> 컴파일러에게 컴파일에 필요한 정보들을 알려줌, 컴파일이란? = 소스코드를 기계어로 변환하는 과정
// <> = 표준 라이브러리 헤더파일을 찾을 때 사용, 컴파일러가 있는 위치에서 해당 파일을 찾음 // "" = 사용자가 만든 헤더파일을 찾을 때 사용, 사용자가 만든 헤더파일이 있는 위치에서 해당 파일을 찾음
// stdio.h = standard input output header file
// stdio.h = 표준 입출력 헤더 파일
// stdio.h = printf, scanf, puts, gets, putchar, getchar 등의 함수를 사용하기 위해 필요한 헤더 파일
// stdio.h = 표준 입출력 함수들을 사용하기 위한 헤더 파일
int main() { // main 함수는 전처리기 지시문 다음에 실행됨, 모든 프로그램의 시작점, 프로젝트에서 단 하나만 있음!
//int = 정수 자료형을 나타낸다. data type.
int age = 20; // 여기서 age는 변수이다. int data type을 가지고 있다. 20 값이다.value. 참고로 Age랑 age는 다르다. 대소문자를 구분함. 변수는 첫 글자로 숫자를 못쓴다. 키워드또한 변수로 쓸수없다. 키워드는 int, float, char 등등이다.
// 변수를 만들면 컴퓨터의 메모리에 변수명으로 공간이 생김. 여기에 처음 값을 넣는 것을 '초기화' 라고 한다.
//변수 선언과 초기화는 동시에 가능하다.
printf("%d \n", age); // printf = print formatted, %d = 정수를 출력하기 위한 서식 지정자(format specifier), format specifier = int, float, char, string 등
age = 21;
printf("%d \n", age);
// int 자료형으로 변수 선언을 한 이후에는 다시 쓸 이유가 없다.
return 0;
}
주석
주석을 하면 컴파일러가 해당 내용은 스킵한다. 그래서 메모용으로 쓰인다. 주석을 하는 방법에는 두 가지가 있다.
- /* {내용} */
- // {내용} — 한 줄만 주석처리함
공부내용 소스코드
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
printf("1 \n");
/*printf("2 \n");*/
//printf("3 \n");
return 0;
}
//주석 처리에는 /* */와 // 두 가지 방법이 있다. /* */는 여러 줄을 주석 처리할 때 사용하고, //는 한 줄을 주석 처리할 때 사용한다. 주석 처리된 부분은 컴파일러가 무시한다.
//주석 쓰는 이유 = 코드를 설명하거나, 코드를 임시로 사용하지 않을 때, 코드를 테스트할 때, 코드를 디버깅할 때, 코드를 보기 좋게 정리할 때, 코드를 숨길 때, 코드를 문서화할 때
// 그냥 메모용으로도 쓴다
실수형 변수
실수는 4.539 와 같이 정수 + 소숫점 자리 숫자들로 이루어진 것들을 말한다.(컴퓨터 언어 기준)
실수를 표현하는 데에는 두 가지 자료형이 있다.
- float (4byte) / 서식 지정자 : %f
- double (8byte) / 서식 지정자 : %lf
float 실수형 변수 선언 방법
float = 46.5f / 뒤에 f를 붙여줘야 한다.
공부내용
1
2
3
4
5
6
7
8
9
10
float f = 46.5f; // 실수형 변수 선언,f를 붙여야 하는데 안붙여도 에러가 나지 않는 이유는 컴파일러가 자동으로 double로 읽은 후 float로 변환하기 때문.
// 그런데 float 는 4바이트, double은 8바이트 이기 때문에 f를 안붙이면 데이터가 잘릴 수 있다. 컴파일러가 double로 읽은 후 float로 변환하기 때문에 데이터 손실이 발생할 수 있다.
//비유하자면 이런 상황과 같습니다. 4명이서 식당에 갔는데 입구에서 안내하는 직원에게 일행이 몇 명인지 말하지 않았습니다. 그랬더니 직원이 뒤따라오던 다른 손님 4명을 포함해 총 8명이 일행이라 생각해 “지금은
// 4명 자리밖에 없어서 대기하셔야 합니다.”라고 말합니다.
printf("%f\n", f); // printf는 기본적으로 실수를 소수점 이하 6자리까지 출력함. 46.500000
printf("%.2f\n", f); // 소수점 이하 2자리까지 출력. 46.50
printf("%.0f\n", f); // 소수점 이하 0자리까지 출력. 46
// %.nf -> 소숫점 n+1자리에서 반올림하여 n자리까지 출력
double d = 4.428;
printf("%.2lf\n", d); // 4.43, lf가 아니라 f로도 서식 지정자를 사용 가능하다. printf 함수가 자동으로 double을 float로 변환함.
상수
상수는 한 번 선언하면 이후 바꿀 수 없다. 변수의 반대되는 개념이다.
공부내용
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
// 상수 constant 는 변하지 않는 값. 변수와 달리 상수는 선언과 동시에 초기화해야 한다!
// 상수는 대문자로 선언하는 것이 관례이다. ex) const int YEAR = 2025;
int main(void) {
const int YEAR = 1972;
printf("C언어가 탄생한 연도 : %d\n", YEAR);
YEAR = 1973; // 상수는 값을 변경할 수 없다. 그러므로 에러코드가 나오게 된다.
// lvalue 란 것은 left value 즉, 왼쪽에 잇는 상수 YEAR를 가리킨다.(식이 수정할 수 있는 lvaule여야 합니다.)
return 0;
}
사칙연산 (더하기)
printf 함수에서 변수명 부분에 직접 숫자와 연산을 넣어서 출력이 가능하다.printf 변수명 부분에 변수를 넣지 않고 숫자를 넣어서 출력이 가능하다.
공부내용
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main() {
/*int add = 3 + 7;
printf("3 + 7 = %d\n", add);*/
printf("%d + %d = %d\n", 3, 7, 3 + 7);
// 변수 선언 없이 계산 결과 출력 가능
printf("%d + %d = %d\n", 30, 79, 30 + 79);
printf("%d X %d = %d\n", 70, 256, 70 * 256);
// printf("서식지정자 서식지정자 서식지정자", 변수명1, 변수명2, 변수명3); 서식지정자는 띄어쓰기로 구분하고 변수명은 콤마로 구분한다.
return 0;
}
문자열(Character, String)
문자 하나를 표현하는 데에는 char 을 사용한다. 문자열은 char[길이] 를 사용한다.
scanf() 보다는 scanf_s() 를 사용하는 것을 추천한다.(비주얼스튜디오 환경)
공부 내용
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
58
#include <stdio.h>
scanf() 보다 scanf_s()를 사용하는 것을 추천! 왜냐하면 scanf()는 버퍼 오버플로(buffer overflow)가 발생할 수 있기 때문이다.
ex)
scanf()의 경우
#include <stdio.h>
int main(void) {
char buffer[10];
printf("Enter a string: ");
scanf("%s", buffer); // 버퍼 오버플로가 발생할 수 있음
printf("You entered: %s\n", buffer);
return 0;
}
scanf_s()의 경우
#include <stdio.h>
int main(void) {
char buffer[10];
printf("Enter a string: ");
scanf_s("%9s", buffer, (unsigned)_countof(buffer)); // 버퍼 크기를 명시적으로 지정
printf("You entered: %s\n", buffer);
return 0;
}
int main(void) {
int input;
printf("정수를 입력하세요. : ");
scanf_s("%d", &input); // 서식 지정자로 받은 정수 값은 &input으로 input의 포인터 즉, input 변수의 메모리 주소이다.
//scanf_s("%d", &input); 의 의미는 input 변수의 주소에 입력받은 값을 저장하라는 의미다.
//&input이 아니라 input으로 쓰면, 에러가 뜬다. 이유는 포인터 때문인데, 포인터는 7장에서 제대로 배울 예정.
printf("\n입력값 : %d\n", input);
return 0;
}
int main(void) {
int one, two, three;
printf("정수 3개를 입력하세요: ");
scanf_s("%d %d %d", &one, &two, &three);
printf("첫 번째 값 : %d\n두 번째 값 : %d\n세 번째 값 : %d", one, two, three);
}
문자는 크게 '문자' 와 '문자열'이 있다. 각각 charactor -> char, string -> str이다.
int main(void) {
char c = 'A';
printf("%c\n", c); // char 문자 자료형(data type) 은 %c로 출력한다.
char str[256]; // c와 같은 문자형 변수를 256개 연속으로 만든다는 의미. 배열(array)에 저장을 한다.
배열일 때는 %s가 서식지정자 이다. 배열이기 때문에 &를 앞에 쓰지 않음. 자세한건 포인터에서.
scanf_s()로 문자열을 입력 받기 위해서는 크기의 명시가 필요.scanf()는 필요없음.
크기 명시의 형식 sizeof(변수명/배열명/자료형), 크기 단위는 byte
scanf_s("%s", str, (unsigned int)sizeof(str)); // str 문자열 변수에 배열로 입력받는다. 크기는 str 사이즈만큼만.
printf("%s\n", str); // 문자열에서 스페이스는 불가능하다. 스페이스를 넣으면 그 전까지만 출력된다.
sizeof앞에 unsigned int가 필요한 이유는 sizeof가 unsigned 형을 반환하기 때문)
이를 형변환 이라고 함. 자세한 것은 7장에서.
다른 방법으로는 str의 크기를 직접 적어주는 방법이 있다. scanf_s("%s", str, 256);
return 0;
}
문자열 출력 예시 코드
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void) {
char str1[256], str2[256];
printf("첫 번째 문자열을 입력하세요 : ");
scanf_s("%s", str1, (unsigned int)sizeof(str1));
printf("\n두 번째 문자열을 입력하세요 : ");
scanf_s("%s", str2, (unsigned int)sizeof(str2));
printf("\n첫 번째 문자열 : %s\n두 번째 문자열 : %s\n", str1, str2);
return 0;
}
마무리
위의 공부 내용들을 가지고 작은 프로그램을 만들어본다 ‘경찰 조서’ 프로그램이다.
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>
int project_main(void) {
char name[256];
int age;
float weight;
double height;
char crime[256];
printf("이름이 무엇입니까? : ");
scanf_s("%s", name, (unsigned int)sizeof(name));
printf("\n몇 살입니까? : ");
scanf_s("%d", &age);
printf("\n몸무게는 몇 kg입니까? : ");
scanf_s("%f", &weight);
printf("\n키는 몇 cm입니까? : ");
scanf_s("%lf", &height);
printf("\n어떤 범죄를 저질렀습니까? : ");
scanf_s("%s", crime, (unsigned int)sizeof(crime));
printf("\n\n---범죄자 정보---\n이름 : %s\n나이 : %d\n몸무게 : %.1f\n키 : %.1lf\n범죄명 : %s\n", name, age, weight, height, crime);
return 0;
}
위의 코드를 변형해서 쇼핑몰 회원가입 양식도 만들어본다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main(void) {
char name[256];
int age;
int birthday;
int shoe_size;
char id[256];
printf("이름을 입력해주세요 : ");
scanf_s("%s", name, (unsigned int)sizeof(name));
printf("\n아이디를 입력해주세요 : ");
scanf_s("%s", id, (unsigned int)sizeof(id));
printf("\n나이를 알려주세요 : ");
scanf_s("%d", &age);
printf("\n생일이 어떻게 되세요? : ");
scanf_s("%d", &birthday);
printf("\n신발 사이즈는 어떻게 되세요?(mm) : ");
scanf_s("%d", &shoe_size);
printf("\n\n---회원 정보---\n이름 : %s\n아이디 : %s\n나이 : %d\n생일 : %d\n신발크기: %d\n", name, id, age, birthday, shoe_size);
return 0;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.