C언어 (1) 기초 사항
비주얼 스튜디오를 설치하고 이제 프로그램을 직접 만들어 본다.
문장, 주석, 함수, 출력 함수를 본다.
입출력 방법
1
2
3
4
5
6
7
#include<stdio.h>
/*주석*/
int main(void){
printf("Hello World!"); //hello world!
return 0;
}
위의 코드는 “Hello World!” 라는 문자열을 출력하는 프로그램이다.
한 줄씩 분석을 해보자
#include
#으로 시작하는 문장은 본격적인 컴파일 전 사전 작업을 하는 전처리기 지시자이다.
#include란 소스 코드에 특정 파일을 포함시키라는 명령어이고, stdio.h라는 헤더 파일을 포함한다.
이 문장의 뒤에는 세미콜론(;)이 붙지 않는다.
stdio.h란 무엇일까?
stdio.h는 C 표준 라이브러리에 포함된 헤더 파일로 Standard Input/Output의 약자이다.
사용자와의 입력 및 출력을 처리하는 함수들이 정의되어 있어 입출력 함수들을 사용할 수 있다.
- stdio.h의 주요 기능
- 입력: 사용자로부터 데이터를 입력받을 수 있는 함수.
- 출력: 데이터를 화면에 출력할 수 있는 함수.
- 파일 입출력: 파일을 읽거나 쓰는 함수
- 입력: 사용자로부터 데이터를 입력받을 수 있는 함수.
- 주요 함수들
- 입력 관련 함수
- scanf(): 콘솔로부터 데이터를 입력.
- getchar(): 하나의 문자를 입력.
- fgets(): 한 줄의 문자열을 입력.
- 출력 관련 함수
- printf(): 콘솔에 데이터를 출력.
- putchar(): 하나의 문자를 출력.
- puts(): 문자열을 출력하고, 자동으로 줄바꿈을 추가.
- 파일 입출력 관련 함수
- fopen(): 파일을 열 때 사용.
- fclose(): 파일을 닫을 때 사용.
- fread(), fwrite(): 파일에서 데이터를 읽거나 쓰는 함수.
- fprintf(), fscanf(): 파일을 통해 데이터 입력 및 출력을 처리하는 함수.
들여쓰기와 주석
C언어에서 줄바꿈과 들여쓰기는 코드에 아무런 영향을 끼치지 않는다.
가독성을 위해 한줄씩 띄워주거나 함수 다음 tab만큼 띄워주면 보기 좋은 프로그램이 된다.
또한 프로그램에 대한 설명을 위해 주석을 달 수 있다.
남이 짠 코드를 보고 바로 이해하는 것은 쉽지 않은 일이기에 긴 코드를 작성할 때는 주석을 꼭 달자.
사용 방법은 “//” 나 /* (주석) */ 으로 쓸 수 있다.
함수
수학에서의 함수는 정의역의 각 원소마다 공역의 원소가 오직 하나씩 대응되는 관계이다.
프로그램에서의 함수는 어떤 입력이 주어지면 출력을 만들어내는 코드의 집합이다.
모든 함수에 입력과 출력이 존재하는 것은 아니지만 빠른 이해를 위해 이처럼 알아두자.
함수의 시작과 끝은 {와 }로 나타내며, main 함수는 특별한 의미를 가진다.
모든 C 프로그램은 main()에서 시작하고, 하나의 main()만 존재해야 한다.
C언어에서 실행 순서는 함수 호출이나 특별한 구문이 없으면 위에서부터 아래로 내려온다.
위의 예시 코드에서 return은 함수가 작업을 끝내고 작업의 결과를 반환할 때 사용한다.
간단히 함수를 종료하는 역할을 한다고 생각해도 된다. 다른 것들은 함수 부분에서 더 다루자.
세미콜론은 문장의 끝을 의미하는 것으로 문장의 마침표와 같다.
개인적으로 세미콜론을 써야지 프로그래밍을 한다는 기분이 든다.
이제 원하는 텍스트를 이렇게 콘솔 화면에 출력하기 위해서 사용한 함수가 printf()이다.
위에 썼듯 stdio.h에 포함된 출력 함수로 printf(“출력하고 싶은 문자열”) 의 형태가 된다.
이 문자열 안에는 \n, \t 같은 특수 문자가 들어가기도 하는데 무슨 뜻인지 알아보자.
이스케이프 문자 | 의미 | 설명 |
---|---|---|
\\ | 백슬래시 (backslash) | 백슬래시 자체를 출력합니다. |
\' | 작은따옴표 (single quote) | 작은따옴표 자체를 출력합니다. |
\" | 큰따옴표 (double quote) | 큰따옴표 자체를 출력합니다. |
\? | 물음표 (question mark) | 물음표 자체를 출력합니다. |
\a | 경고음 (alert) | 경고음을 발생시킵니다. |
\b | 백스페이스 (backspace) | 커서를 왼쪽으로 한 칸 이동시킵니다. |
\f | 폼 피드 (form feed) | 페이지를 나누는 제어 문자로, 주로 프린터에서 사용됩니다. |
\n | 줄 바꿈 (new line) | 줄 바꿈을 합니다 (줄 끝으로 이동). |
\r | 캐리지 리턴 (carriage return) | 커서를 줄의 맨 앞으로 이동시킵니다. |
\t | 탭 (horizontal tab) | 수평 탭을 삽입합니다. |
\v | 수직 탭 (vertical tab) | 수직 탭을 삽입합니다. |
\0 | 널 문자 (null character) | 문자열의 끝을 나타내는 널 문자입니다. |
이렇게 특수 문자를 출력하기 위한 \‘나 \”, 특별한 기능을 위한 \(문자)가 있다.
가장 많이 쓰는 것은 \n (줄 바꿈), \t (탭) 정도이고 나머지는 필요할 때 찾아보면 된다.
백준 개 출력하기
특수 문자로 이뤄진 개를 출력하는 문제로 풀어보면 이스케이프 문자 관련 출력 이해에 도움이 된다.
서식 문자
위의 특수 문자 말고도 서식 문자가 있다.
서식 문자 | 의미 | 설명 |
---|---|---|
%d | 십진수 정수 (decimal integer) | 부호 있는 십진수 정수 출력 |
%i | 십진수 정수 (decimal integer) | %d 와 동일, 부호 있는 십진수 정수 출력 |
%u | 부호 없는 십진수 (unsigned decimal) | 부호 없는 십진수 정수 출력 |
%f | 부동소수점 숫자 (floating point) | 소수점을 포함한 실수 출력 (소수점 이하 6자리까지 기본 출력) |
%lf | 배정도 실수 (double floating point) | double 타입의 실수 출력 |
%e | 지수형 (exponential) | 실수를 지수형으로 출력 (1.23e+03 ) |
%g | 자동 형식 선택 (automatic format) | 실수를 적절한 형식으로 출력 (%f 또는 %e 중 선택) |
%c | 문자 (character) | 하나의 문자 출력 |
%s | 문자열 (string) | 문자열 출력 |
%x | 16진수 소문자 (hexadecimal, lowercase) | 16진수 출력 (소문자) |
%X | 16진수 대문자 (hexadecimal, uppercase) | 16진수 출력 (대문자) |
%o | 8진수 (octal) | 8진수 출력 |
%p | 포인터 (pointer) | 포인터 주소 출력 |
%n | 출력된 문자 수 (number of characters) | 출력된 문자 개수를 해당 변수에 저장 |
%% | 퍼센트 기호 (%) | 퍼센트 기호를 출력 (% 자체 출력) |
예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main() {
printf("%d + %d = %d\n", 3, 5, 3+5); // 정수 출력
printf("10진수: %d, 16진수: %x, 8진수: %o\n", 50, 50, 50); // 16진수 8진수 출력
printf("%f, %lf, %.8lf\n", 0.1234567, 0.1234567, 0.1234567); // 실수 출력
printf("%f, %e, %g\n", 0.1234567, 0.1234567, 0.1234567); //실수 출력 2
printf("%s %c이다.\n", "a를 대문자로 하면", 'A'); // 문자열 출력
printf("%3d + %4d = %5d\n", 3, 5, 3+5); // 필드 폭 지정 정수 출력
return 0;
}
1
2
3
4
5
6
3 + 5 = 8
10진수: 50, 16진수: 32, 8진수: 62
0.123457, 0.123457, 0.12345670
0.123457, 1.234567e-01, 0.123457
a를 대문자로 하면 A이다.
3 + 5 = 8
출력 결과는 밑과 같다.
3번째 줄처럼 %lf로 실수 출력시 소수점 자리는 기본적으로 6자리이고, 그 이상이면 반올림되어 출력된다.
더 많은 소수점을 출력해야하는 경우에는 %.8lf와 같이 %.(숫자)lf를 사용해 출력할 수 있다.
그렇다면 몇 자리까지 정확하게 저장을 할 수 있을까? 이것은 자료형 파트에서 부동소수점과 같이 알아보자.
지수표기법이란 123.5 같은 수를 1.235e+2 (1.235 x 10^2)로 표현하는 것으로
유효 숫자 M (1<=|M|<=10)과 지수 N (10^N)으로 (M)e(N) 형식으로 사용한다. 아주 크거나 작은 수를 쓸 때 유용하다.
마지막 printf에서 %3d, %4d가 있는데 출력 칸을 조절하는 것으로 깔끔하게 출력할 때 도움이 된다.
가장 처음 해보는 입출력이라 표도 많고 길어졌지만 해보면 어렵지 않은 내용이다.
프로그램이라면 실행되면서 사용자가 입력하는 값에 따라 행동해야 한다. 그것을 어떻게 할까?
다음 글 주제는 변수와 상수이다.