Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ftz
- 드림핵
- webhacking
- 웹
- 해킹
- 시스템해킹
- XSS
- 웹해킹
- CodeEngn
- dreamhack
- 소프트웨어
- 순서도
- reversing
- WarGame
- 소프트웨어보안
- bee-box
- TCP
- 알고리즘
- 리버싱
- System
- Web
- 네트워크
- 모의해킹
- 워게임
- Webhaking
- hacking
- 네트워크보안
- 비박스
- 시스템
- network
Archives
- Today
- Total
Without a Break
C언어에 대한 이해 본문
C 프로그램 구조
- 한 개 이상의 함수들로 구성
- 함수몸체 : 중괄호 { }
- 화이트 스페이스(white space) 삽입 : 변수나 값, 키워드를 억지로 분절시키지 않는 이상, 빈 줄이나 빈 칸, 탭과 같은 공백을 마음대로 넣는 것을 허용하는 것
- 각 함수들 사이에 들여쓰기를 사용하여 소스코드의 가독력 향상 => 통합개발환경(IDE)에서는 들여쓰기 실수로 인한 오해 유발을 막기 위해 시스템이 자동으로 들여쓰기 진행
- C언어는 전달하고 전달받는 변수나 값의 데이터 타입이 서로 일치하는지 번역 단계에서 미리 점검하여 오류를 줄이는 특징을 가짐
C 문장
- 든 C 문장은 세미콜론(;)으로 종료
- 문장의 끝에 세미콜론을 붙인다면 한 줄에 여러 C 문장을 쓰는 것도 가능
- 콤마(,) 연산자를 통해 C문장을 나열형으로 변형하여 한 개의 문장으로 표현할 수 있음 => 반복 선언
- 콤마 연산자는 콤마 좌우에 있는 구성요소 문장들을 왼쪽부터 오른쪽으로 순서대로 계산을 진행 -> 맨 마지막 결과 값을 최종 값으로 사용
- 변수형(data type)을 선언하는 C문장은 계산을 진행하는 문장이 아니므로 반복 선언 불가능
//일반 코드
A = 10;
B = 25;
SUM = A + B;
//세미콜론을 사용해 한 줄에 여러 C문장 작성
A = 10; B = 25; SUM = A + B;
//콤마 연산자를 사용해 한 줄에 C문장을 나열형으로 변형
A = 10, B = 25, SUM = A + B;
//변수형(data type)을 선언하는 C문장은 반복 선언 불가
int SUM, int A, int B; //오류 발생
//같은 데이터 타입으로 변수형 선언은 가능
int SUM, A, B;
main 함수
- main 함수로부터 C프로그램이 시작하고 종료 => main 함수는 유일하게 존재해야 함
- main()로 표기
- 시스템에 의하여 최초로 호출되는 특별한 함수
- 괄호 안에 2개의 매개변수 argc와 argv는 main() 함수가 시스템으로부터 넘겨받는 입력 값이 모두 몇 개인지, 각각의 입력 값들이 무엇인지 인수인계 받기 위한 것
- 시스템으로부터 넘겨받는 입력 값이 없음을 강조하기 위하여 main(void)로 표현하기도 함
파라미터(parameter) / 매개변수
- 자신을 호출한 곳으로부터 어떤 값을 입력으로 전달 받아 작업을 진행한 후 그 결과 값을 반환하게 되는데, 이 때 전달받을 입력을 보관할 변수
return문
- 자신을 호출한 함수에게 결과 값을 반환할 때 사용
- 반환할 결과 값이 없는 경우, 함수 몸체 중에 return 문은 나타나지 않음
- 함수가 return할 결과 값의 데이터 타입(자료형)을 함수이름 앞에 명시해주어야 함
- 함수라 return할 값이 없다면 함수 이름 앞에 void라는 특별한 데이터 값을 명시함 (비어있다는 뜻)
전처리기
- C 프로그램에서 자주 상요하는 함수들은 일반 사용자가 매번 반복하여 작성하지 않도록 미리 정의해놓은 C 소스의 경로를 자신의 프로그램 안에 명시하여야 함
- 전처리기 : 컴파일러가 사용자가 작성한 C 프로그램 소스 코드를 컴파일하기 직전에, 시스템이 제공하는 소스 코드를 미리 포함한 후 컴파일 전 사전 작업을 처리해 주는 시스템 프로그램
- main() 함수 앞에 #으로 시작한느 문장을 사용하면 프로그래머가 전처리기에 무엇을 먼저 해야 할지 알려줄 수 있다
- #으로 시작된 문장은 무조건 줄 단위로 구분되므로 세미콜론(;)이 필요 없음
- #include <stdio.h> = 표준 입출력. 이때, <>안에 있는 파일을 헤더(header) 파일이라고 함
- stdio.h 파일에는 printf(), scanf(), getc(), getchar(), putc(), getw(), putw(), fgets(), fputc() 등이 다양한 입출력 함수들이 정의되어 있음
변수 선언
데이터_타입 변수명;
- 사용하고자 하는 변수는 사용하기 전에 미리 어떤 데이터 타입(자료형)을 보관하는 변수인지 선언해야 함
- 변수명에서 대문자와 소문자는 서로 다른 문자로 간주
- 변수를 선언함과 동시에 초깃값을 바로 설정 가능. ex) int a = 10;
- C 언어에서 자주 사용하는 "기본 데이터 타입"
배열변수와 포인터
배열 변수와 포인터
데이터_타입 배열변수명[배열크기];
- 배열변수 : 값들을 기억장소 안에 연속하여 보관하는 장소 => 연속적인 기억장소에 보관됨
- 배열변수는 미리 보관할 데이터 타입을 선언하고 적절한 때 필요한 공간을 배정받아야 함
- 배열변수도 사용 전에 먼저 변수 선언을 한 후 사용해야 함
- 배열의 각 원소를 접근할 때는 배열이름 뒤, 대괄호 사이에 인덱스 번호를 넣음 => C언어에서 배열 인덱스는 0부터 시작하여 (배열크기 -1)까지 할당
- 포인터 타입 : '배열이름'은 첫 번째 배열원소에 대한 기억장소 주소 값을 보관. 이 때, 주소 값을 보관하는 변수
- & : 연산자 가운데서 변수의 주소 값을 계산해주는 연산자. ex) &VAL[0]은 배열변수 VAL의 첫 번째 배열원소 VAL[0]에 대한 주소 값을 계산하도록 하므로, VAL과 &VAL[0]은 동일한 표현
2차원 배열
데이터_타입 배열변수명[행크기][열크기]
- 배열들의 배열
- ex) float SCORE[3][4];
- 이런 식으로 배열을 구조화하면, 3차원, 4차원 배열선언도 가능해짐
수식연산자
산술연산자
연산자 | 표현수식 | 의미 |
+ | A+B | 변수 A와 B에 저장된 값을 더한다 |
- | A-B | 변수 A에서 B에 저장된 값을 뺀다 |
* | A*B | 변수 A와 B에 저장된 값을 곱한다 |
/ | A/B | 변수 A의 값을 B에 저장된 값으로 나눈다 |
% | A%B | 변수 A에 저장된 값을 B에 저장된 값으로 나눈 나머지이다 |
증감연산자
- 증감 연산자가 변수의 '앞'에 붙는 경우 : 증감을 먼저 시키고 변수 값을 사용
- 증감 연산자가 변수의 '뒤'에 붙는 경우 : 현재 변수의 값을 필요로 한느 곳에 먼저 제공하여 사용하게 한 후 증감 연산을 나중에 실시
연산자 | 표현 수식 | 의미 |
++ | A++; | 변수 A에 저장된 값을 1만큼 증가 (A = A +1;) |
++A; | 변수 A에 저장된 값을 1만큼 증가 (A = A +1;) | |
-- | A--; | 변수 A에 저장된 값을 1만큼 감소 (A = A -1;) |
--A; | 변수 A에 저장된 값을 1만큼 감소 (A = A -1;) |
배정 연산자
- 변수에 어떤 값을 저장할 때 사용한다
연산자 | 표현 수식 | 의미 |
= | A = 10; | 변수 A에 10을 배정한다 |
A = B= 10; | B = 10; A = B; 와 동일하다 즉, 변수 B에 10을 배정한 후, 변수 A에 변수 B의 값을 배정한다. 오른쪽부터 왼쪽으로 배정(=)이 이루어진다. |
|
+= | A += 10; | A = A + 10;과 동일하다 |
-= | A -= 10; | A = A - 10;과 동일하다 |
*= | A *= 10; | A = A * 10;과 동일하다 |
/= | A /= 10; | A = A / 10;과 동일하다 |
%= | A %= 10; | A = A % 10;과 동일하다 |
관계 연산자
- 두 수 간에 관계를 비교하는 데 사용
- 관계가 성립하면 (참,true) 1을, 성립하지 않으면 (거짓,false) 0을 결과 값으로 생성
연산자 | 표현 수식 | 의미 |
> | A > B | A에 저장된 값이 B에 저장된 값보다 큰가? |
>= | A >= B | A에 저장된 값이 B에 저장된 값보다 크거나 같은가? |
< | A < B | A에 저장된 값이 B에 저장된 값보다 작은가? |
<= | A <= B | A에 저장된 값이 B에 저장된 값보다 작거나 같은가? |
== | A == B | A에 저장된 값이 B에 저장된 값과 같은가? |
!= | A != B | A에 저장된 값이 B에 저장된 값과 다른가? |
논리 연산자
- AND (논리곱) : 하나라도 0이면 결과는 0, &&연산자
- OR (논리합) : 하나라도 1이면 결과는 1, ||연산자
- NOT (부정) : 논리 연산을 수행하는 데 사용, !연산자
변수 A의 값 | 변수 B의 값 | A && B | A || B | ! A |
0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 |
조건 연산자
- ?:
- 3개의 값을 받아서 첫 번째 값이 참(1)이면 두 번째 값을, 첫 번째 값이 거짓(0)이면 세 번째 값을 결과 값으로 설정
연산자 | 표현 수식 | 의미 |
? : | A ? B : C | A가 참이면 B를, 거짓이면 C를 결과 값으로 설정 |
타입변환 연산자
- 데이터 타입을 강제로 바꿀 때 사용하는 연산자
- 괄호 사이에 바꾸고 싶은 데이터 타입을 명시
- 캐스트(cast) 연산자라고도 부름
- C 언어에서는 상이한 데이터 타입의 값들을 혼용하면 정확도가 높은 쪽으로 타입 변환이 자동으로 일어남 => 이 때, 사용자가 강제로 변환하고 싶으면 타입변환 연산자 사용
float A;
int B,C;
A = 1.3;
B = 2;
C = (int)(A * B); //강제 타입변환
입출력함수
printf()
printf("출력 형식", 출력 대상);
- 큰 따옴표 사이에 있는 내용은 화면에 그대로 출력된다. 다만, 출력 형식 안에 특별한 기호(\와 %)는 그대로 출력되지 않고 다른 의미로 해석
printf() 입출력함수 구분
- 타입지정(%)에서 자릿수까지도 지정 가능
확장문자(\) | \n | 줄 바꿈 |
\t | 공백 8개(탭) 출력 | |
\" | 끝 따옴표(") 출력 | |
\b | 커설르 한 문자 앞으로 이동 | |
\\ | 백슬래시(\) 출력 | |
타입지정(%) | %d | 해당 출력 대상을 10진수로 출력 |
%f | 해당 출력 대상을 실수로 출력 | |
%c | 해당 출력 대상을 문자로 출력 | |
%x | 해당 출력 대상을 16진수로 출력 | |
%o | 해당 출력 대상을 8진수로 출력 |
scanf()
scanf("입력 형식", 입력 대상);
- 큰 따옴표 사이에 있는 내용에는 뒤에 오는 입력 대사에 대한 타입 지정이 %를 사용하여 이루어짐
scanf() 입출력함수 구분
- 입력 대상에서 변수 이름 앞에 &(주소 연산자)를 붙임 => 읽어 들인 데이터를 해당 주소가 가리키는 기억 장소에 저장하도록 하기 위함
- scanf()에 의하여 데이터를 입력받을 경우 마지막에 Enter키를 눌러야 입력 완성
타입지정(%) | %d | 해당 입력 대상을 10진수로 입력 |
%f | 해당 입력 대상을 float 타입 실수로 입력 | |
%lf | 해당 입력 대상을 long 타입 실수로 입력 | |
%c | 해당 입력 대상을 문자로 입력 | |
%x | 해당 입력 대상을 16진수로 입력 | |
%o | 해당 입력 대상을 8진수로 입력 |
주석
주석 표현 | 주석 |
/* 주석부분 */ | - /* 부터 시작하여 */ 까지의 부분이 주석 - 주석부분은 여러 줄에 걸쳐 작성되어도 상관 없음 |
// 주석부분 | - 줄 단위 주석으로서 줄 맨 앞에 //를 삽입 - 여러 줄을 주석으로 할 경우, 줄마다 맨 앞에 //를 각각 삽입해야 함 |
반복구조
- 조건식에 아무것도 명시되어 있지 않거나 1(참)로 명시되어 있으면, 무조건 반복에 해당되어 무한반복 => break문 사용하여 반복구문 벗어날 수 있음
- 조건식이 0(거짓)으로 명시되어 있으면, 조건을 만족하지 못하므로 바로 종료
- for 구문은 반복할 횟수가 정해진 경우에 사용하며, while 구문이나 do while 구문은 횟수보다는 조건을 중심으로 반복 여부를 결정하는 경우 사용
for문
- 초기식 수행 -> 조건식 점검 참인 경우에만 반복 문장 수행 -> 증감식 수행 후 다시 조건식 점검해 참인 경우 반복
- 만일 처음부터 조건식이 참이 아니면 반복할 문장은 한 번도 수행되지 않음
while문
- 조건식이 참인 경우에만 반복할 문장을 수행
- 처음부터 조건식이 참이 아닐 경우, 반복할 문장은 한 번도 수행되지 않음
do-while문
- 반복할 문장을 무조건 먼저 수행한 후, 조건식이 참인 경우에만 다시 반복
- 마지막 끝에 세미콜론(;)을 붙임
조건분기구조
- C 언어에서는 조건에 따라 프로그램을 수행할 영역을 달리하는 조건분기구조 제공
- if, else, else if와 switch{case ... default}
흐름변경 문장
흐름변경용 C 문장 | 해석 |
break; | 반복구문 안에서 반복을 중단 |
continue; | 반복구문 안에서 반복을 아예 중단하지 않고 이 시점부터 다음 반복으로 넘어갈 때 사용 |
goto label; | label: 로 명시된 곳으로 프로그램 흐름을 강제로 바꿈 |
'Algorithm > 컴퓨터알고리즘' 카테고리의 다른 글
누승 활용 수열, 제곱의 합, '+,-' 교행 수열 (0) | 2022.10.07 |
---|---|
[순서도 실습] 백준 11653번 - 소인수분해 (C) (0) | 2022.10.03 |
기본 수열, 등차/등비 수열, 피보나치 수열 (0) | 2022.10.03 |
[순서도 실습] 백준 2033번 - 반올림 (C) (0) | 2022.09.28 |
C 프로그램 사례 (0) | 2022.09.28 |