노트북이 정리한 내용을 다 날려먹었다 ㄴ이러ㅣㅁㄴㅇ러ㅣㄴㅁ어리ㅏㄴㅁ리
임시저장 필수다 정말
주석(comment) : 프로그램에 대한 설명
C에서 이용가능한 주석 지정 방법
/* 과 */을 이용한 여러 줄 주석
//을 이용한 한 줄 주석
주석이 코드에 영향을 미치지는 않기에 작성하지 않아도 되나 가독성이 좋은 코드, 즉 알아보기 쉬운 코드가 좋은 코드라는 것을 다들 알고 있지 않던가.
1) 함수
C 프로그램을 이루는 기본 단위는 문장(statement)이다.
각 문장은 세미콜론(;)으로 끝난다.
함수를 만들 때는 리턴형, 함수명, 매개변수가 필요하다.
함수가 처리할 내용, 즉 문장들은 { 과 } 안에 써준다.
2) 진입점 함수
main함수는 C프로그램이 처음 시작될 때 호출되는 함수로 진입점(entry-point) 함수라고 한다.
C프로그램에는 main함수가 반드시 필요하다. main 함수는 Main이나 MAIN은 잘못된 사용이다.
일반적으로 리턴 값이 있는 함수는 반드시 return문을 가져야 하나, main함수에 한해서 return문을 생략할 수 있다.
프로그램의 종료 코드가 0이면, 정상 종료를 의미하며 종료 코드가 1이라면 비정상 종료를 의미한다.
3) 들여 쓰기
C 코드에서는 세미콜론(;)이 문장의 끝을 의미한다.
일반적으로 가독성을 위해 한 줄에 한 문장씩 작성한다.
{ }로 묶인 문장들을 블록(block)이라고 한다.
출력
입출력 라이브러리에서 키보드 입력을 표준 입력, 콘솔로의 텍스트 출력을 표준 출력이라고 한다.
입출력 라이브러리가 제공하는 표준 입출력 함수를 사용하기 위해서는 <stdio.h>를 사용해야 한다.
라이브러리의 함수명, 리턴형, 매개변수의 정보를 지닌 것이 헤더 파일(.h)이다.
C 프로그램에서 콘솔에 텍스트 출력을 위해서는 printf 함수를 이용해야 한다.
문자열 출력 후에 커서를 다음 줄로 이동하기 위해서는 다음과 같이
문자열 내에 줄 바꿈 문자('\n')를 함께 출력해야 한다.
ex) printf("스벅 왤케 추워요 \n"); //출력하고 커서를 다음 줄로 이동
변수
변수 : 어떤 값을 저장하기 위한 공간
변수를 사용하기 위해서는 변수명과 데이터형(data type)이 필요하다.
변수는 선언(declaration) 후 사용해야 한다.
데이터형 변수명 ;
ex) int num; //정수형 변수 선언
float x; //실수형 변수 선언
char ch; //문자형 변수 선언
C언어에서는 반드시 변수의 첫 글자에는 영문자나 밑줄 기호가 와야 하며,
변수명 중간에는 빈칸이나 다른 기호를 사용해서는 안된다.
-------------------------------------------------------------------------------------------------------------------------
변수에 값을 저장하는 것을 보통 변수에 값을 대입한다 라고 표현한다.
ex)
num = 10;
x = 12.34;
ch = 'X';
변수 값을 읽어 올 때도 변수명을 사용한다.
printf("%d", num);
x = num + 0.1;
printf함수
주어진 값을 형식에 맞춰 출력하는 기능을 제공
printf 함수 형식 문자열
서식 지정자 | 의미 | 사용 예시 | 실행 결과 |
%d | 정수를 10진수로 출력 | int num = 123; printf("%d", num); |
123 |
%x | 정수를 16진수로 출력 (0~9, a~f 사용) |
int num = 123; printf("%x", num); |
7b |
%X | 정수를 16진수로 출력 (0~9, A~F 사용) |
int num = 123; printf("%X", num); |
7B |
%f, %F | 실수를 부동소수점 표기 방식으로 출력 | float x = 1.23; printf("%f", x); |
1.230000 |
%e, %E | 실수를 지수 표기 방식으로 출력 | float x = 1.23; printf("%e", x); |
1.230000e+00 |
%c | 문자 출력 | char ch = 'A'; printf("%c", ch); |
A |
%s | 문자열 출력 | char name[20] = "abc"; printf("%s", name); |
abc |
문자 폭 지정
%8d 라고 예시를 들면 %8d는 8칸에 맞춰 오른쪽부터 출력
12345를 출력한다고 하면 앞에 3자리를 남기고 12345가 출력된다.
이에 반해 %08d를 통해 12345를 출력하게 되면 앞에 공백이 아닌 00012345가 출력되는 것이다.
정밀도 지정
printf 함수는 실수를 출력할 때 디폴트로 소수점 이하 6자리를 출력한다.
ex) 12.345678를 기준으로 보자.
%f를 통해 출력 시 12.345678이 출력
%.2f를 통해 출력 시 12.35가 출력된다. 소수점 이하 2자리만 출력하되 반올림 출력된다.
%8.2를 통해 출력 시 전체 8 문자 폭에 소수점 이하 2자리 출력이 되는 것이다. 12.35이나 다르게 출력된다.
scanf함수
scanf함수는 콘솔에서 키보드로 입력한 값을 읽어온다.
변수명 앞에는 &을 지정하는데, 변수명 앞에 &을 지정하면 '~에'라는 의미를 담는다.
scanf함수의 형식 문자열
서식 지정자 | 의미 | 사용 예시 |
%d | 정수를 10진수로 입력 | int num; scanf("%d", &num); |
%x | 정수를 16진수로 입력 | int num; scanf("%x", &num); |
%i | 정수를 10진수, 8진수, 16진수로 입력 (012는 8진수, 0x12는 16진수) |
int num; scanf("%i", &num); |
%f | float형 실수 입력 | float x; scanf("%f", &x); |
%lf | double형 실수 입력 | double y; scanf("%lf", &y); |
%c | 문자 입력 | char ch; scanf("%c", &ch); |
%s | 문자열 입력 | char name; scanf("%s", name); |
scanf를 사용하다 보면 종종 컴파일 경고나 링크 에러가 발생한다.
scanf는 버퍼 오버플로우 문제가 발생할 위험이 큰데, 이 때문에 나온 것이 scanf_s이다.
scanf_s를 사용하면 오버플로우가 발생하게 되면 외부에 데이터를 저장하지 않는다.
버퍼 오버플로우의 의미는
"프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미한다"
알빠노라고 생각할 수도 있지만..
scanf_s의 사용은 데이터 오염이나 악의적 프로그래머 등으로 인한 피해를 방지할 수 있다.
scanf_s의 경우, 보안적으로는 문제해결이 되나 Visual Stdio에서만 지원이 되므로 호환성면에서 문제를 야기한다.
그렇기에 #define _CRT_SECURE_NO_WARNINGS를 통해 경고를 뜨지 않게 할 수 있다.
종종 CRT_SECURE_NO_WARNINGS를 사용하면 자동으로 scanf_s 처리를 해준다고 하는데 이는 잘못된 정보이다.
scanf 함수에서는 문자 배열에 입력 시에는 &를 지정하지 않는다.
scanf 함수의 형식 문자열 안에 %로 시작하는 서식 지정자를 여러 개 사용 시에는, 서식 지정자와 입력받을 변수의 개수가 같기만 하면 된다.
ex) scanf("%s %d %c", name, &age, &gender);
공백문자
공백 문자의 역할은 입력 시 입력되는 항목들을 구분하는 역할을 하므로 빈칸을 통한 공백이나 탭 문자(\t)를 통한 공백 문자를 무시 어떤 것이든 사용가능하다.
ex)scanf("%s %d %c", name, &age, &gender);
scanf("%s\t%d\t%c", name, &age, &gender);
마지막으로 데이터형을 잘못 사용할 경우 컴파일 에러가 발생할 수 있으므로 주의하자.
printf 함수를 통해 실수 값을 출력할 때는 float이나 double에 상관없이 %f와 %lf 둘 다 사용 가능하다.
'Language & Framework & GIT > C' 카테고리의 다른 글
[씨앤씨뿔] C/ 함수 (0) | 2023.04.04 |
---|---|
[씨앤씨뿔] C/ 제어문 (0) | 2023.03.28 |
[씨앤씨뿔] C/ 연산자 (0) | 2023.03.27 |
[씨앤씨뿔]C/ 데이터형&연산자 (0) | 2023.03.25 |
[씨앤시뿔] C/ C? (2) | 2023.03.23 |
댓글