본문 바로가기

프로그래밍./C언어.

C언어 정리. 간략하게


C언어 정리 요약 했던 것들. 간단하게.

0이 아닌 모든 수는 True로 인식
%표기하고 싶을 땐 %% 하면 나옴.
"는 \" 로 쓰면 됨

sizeof(배열)/sizeof(배열타입)
하면 배열의 요소의 개수가 나온다.

int arr[10] 경우

배열 사이즈는 40일꺼구
인트 사이즈인 4로 나누면 10.

EOF - 입력 함수가 파일의 끝을 의미.
파일이 아니고 키보드 입력의 경우
CTRL + Z로 인식. 중지.


문자 입.출력 함수(putchar, fputc, getchar, fgetc)
 
getchar, fgetc 한 문자만 입력 받아서 반환.
fgetc는 파일에서도 입력 받을 수 있다. (파일 내용 읽기)

putchar, fputc 한 문자만 출력.
fputc는 파일로도 출력 할 수 있다. (파일에 내용 쓰기)



문자열 입.출력 함수(puts, fputs, gets, fgets) 
 
puts, fputs 문자열 출력. 
fputs 는 자동으로 줄바꿈. 

gets, fgets - 문자 열을 입력 받아서 반환
fgets 정해진 글자수 만큼만 입력 받는다.

문자배열이 입력 받는 문자열보다 작을수 있으므로.
때문에 거의 fgets만 사용한다고 한다.


문자열 복사 함수 (strcpy, strncpy)
strcpy(새 변수, 원본) - 복사 함수.
strncpy(새변수, 원본, (sizeof(새변수)/sizeof(새변수타입))-1)
 - 원본이 새 변수 보다 작을 경우 
새 변수의 길이 보다 하나 작은 만큼만 복사.
그리고 새변수[sizeof(새변수)-1 = '\0' 
문자열의 마지막을 알리기 위해서 null 추가.
그러기 위해서 -1만큼만 복사 한것.
변수라 했지만, 사실상 배열인 경우에 사용함. 

문자열 추가 함수 (strcat, strncat) [문자열 붙이기]
strcat(변수1, 변수2) - 1 뒤에 2 붙이기.
strncat(변수1, 변수2, 길이) - 길이만큼만 붙이기
 - 변수1의 길이가 모자랄 수도 있으므로.
strlen(변수) - 문자열의 길이 반환
알아서 null 전까지만 계산해서 반화해 주지만
직접 키보드로 입력해서 확인하는 경우
엔터를 입력하는 것까지 포함하기 때문에
원래 길이에 +1 이 된다.
strcmp(변수1, 변수2) - 같은지 검사.
변수 1이 2보다 크면 양수값, 작으면 음수값. 
ABC 와 ABD중 큰 것은 ABD 사전처럼
뒤쪽에 나오는게 큰거라 생각하면 됨
strncmp - 위와 같지만 개수를 정할 수 있음
3번째 글자까지 검사 하게 끔 하는 것 처럼.
변수라 했지만, 사실상 배열인 경우에 사용함. 


int atoi(char *ptr);  - 문자열을 int 형태로 변환
long atol(char *ptr); - 문자열을 long 형태로
double atof(char *ptr); - 문자열을 double

int toupper(int c); - 소문자를 대문자로
int tolower(int c); - 대문자를 소문자로

int fflush(FILE * stream) - 버퍼를 지우는 함수
성공시 0, 실패시 EOF 반환
입력의 경우 그 버퍼 내용이 삭제 되지만
출력의 경우 삭제가 아닌, 목적지로 출발이다.
즉, 모니터에 바로 출력된다는 의미이다.

숫자인지 아닌지 구분하기 보단,
그냥 아스키 코드 값(48~57)으로 맞는지 아닌지 확인.

int atoi(char *ptr) - 문자열을 int형 데이터로 변환
long atoi(char *ptr) - 문자열을 long 형으로
double atoi(char *ptr) - 문자열을 double 형으로

int toupper(int c) - 소문자를 대문자로
int tolower(int c)  - 대문자를 소문자로
(ctypes.h 에 있으므로 사용시 선언해줘야 함)

구조체와 ->연산자 .연산자
구조체 선언 2가지 방법
정의와 동시에 선언하는 방법과 따로 하는 방법.
struct 구조체명
{
int x;
int y ;
} p1, p2;

또는

struct 구조체명
{
int x;
int y ;
struch point p1, p2, p3;


참고.
함수의 크기. 하나의 함수는 하나의 기능만을 갖는게 좋음.

구조체와 포인터. 주의점
(*pman).name - 괄호를 사용해야 하는 이유는
. 연산자가 *연산자 보다 우선순위가 높기 때문이다.
괄호를 하지 않으면 *(pman.name) 이런식이
되어버린거나 마찬가지다. .연산자를 우선하기 때문에.

call by value 인 경우. 
&주소로 넘기고 *포인터로 받는게 아닌경우
함수를 선언해서 구조체를 넘겨 받을시
함수 선언보다 구조체 선언이 더 위에 있어야 한다.

void swap(struct simple test);
struct simple
{
int t1;
int t2;
};
이렇게 함수 선언이 먼저 나오면 에러..... - -;
swap 함수선언에서 simple 구조체를 찾지 못함.

하지만, call by reperence 인경우는 상관없음.
void swap(struct simple* test);
하고 swap(&구조체명) 할때는 상관 없다.

대신 레퍼런스의 경우 .연산자가 아닌 ->로 써야함.
반대로 벨류의 경우는 .연산자를 사용해야 한다.

구조체 멤버에 scanf 받을 때도 & 꼭 써줄것.
구조체를 반환하는 함수를 사용할 때는
struct 만 쓰는게 아니라 어떤 struct 를 사용할지
같이 써주어야 한다. 만들어 놓은 구조체 명.
struct point PointAdd();
point 라는 구조체를 반환하는 PointAdd 함수 선언.

함수에서 구조체를 리턴한 경운 메인에서는
받는 구조체가 있어야 한다.
result = PointAdd(f,s)
result 라는 구조체도 만들어줘야 한다.
당연히 반환받는 구조체와 같은 구조체로. point
typedef 자료형의 이름을 다른 것으로.
typedef int test : int를 int 대신 test로. 
아마. 주로 그런 선언을 간편하게 하기위해 쓰는듯.
구조체도 가능한데, typedef strcut simple S
라고 하면 구조체 선언시 원래는
struct simple s ;     struct simple 다 썼었지만
S로 대체해서, S s; 이렇게만 쓰면 끝.

선언과 동시에 변경하는경우

typedef struct simple
{
.
.
} S;
이렇게 하면 구조체 선언과 동시에 typedef 선언.


매크로함수
#define SQUARE(x) x*x;
int square(int x);

int a = 3
printf("SQUARE : %d",  SQUARE(a+3));
printf("SQUARE : %d",  square(a+3));

처음껀 15가 나오고 두번째껀 36이 나온다.

일반함수의 경우 (a+3)*(a+3) 즉 덧셈을 먼저하지만
매크로 함수는 a+3*a+3 되어서 곱셈이 먼저 된다.

이걸 방지하기 위해서는 SQUARE((a+3)) 도 있지만
매번 신경쓰기 힘들기 때문에 좋은 방법이 아니고,
매크로를 선언할 때 ((x)*(x)) 감싸주는게 좋다.

헤더파일 선언시 "" 사용은 주로 사용자가 만든경우.
<>은 표준 디렉토리에서 찾으라는 의미.
그러니까 ""는 표준 디렉토리에 없는 곳도 찾는다.
현재 소스파일이 있는 곳부터 검색한다고 함.


%x - 16진, u - 부호없는 10진,
i - 부호 없는 8진, o - 부호 있는 8진
%p - 인수에 지정된 포인터 주소 값을 16진수로.
%n - 출력된 문자수를 인수에 저장.

- 왼쪽 정렬 (기본은 오른쪽 정렬) 
즉 공간이 남을 시에 어느쪾을 공백으로 채울지.

+ 부호 있는 변환에서 앞에 부호 문자를 붙임.
0 여백을 0으로 채움.
공백 양수값은 +기호 대신 공백. 음수는 -
# 다음 변환 지정자에 따른 형식사용
0  : 0을 앞에 붙임.
x,X : 0x또는 0X를 붙임.
e,E,f : 항상 소수점을 붙임.
g, G : 항상 소수점 붙임 뒷부분 0 생략 안함.


int main(int argc, char* argv[])
argc -> argv 배열의 크기 (커맨드 라인 +1)
argv[0] -> 프로그램 파일의 경로와 파일명의 문자열
argv[1] -> 첫번 째 인수.

여러개의 문자가 아닌, "문자열" 인 경우

char 형의 다차원 배열이 아니라
char *a[] 포인터 배열을 사용한다.
(그래서 문자열 배열 이라고도 표현한다.) 


특정 범위 내의 정수를 발생시키는 방법
(rand() % (최대 - 최소+1) + 최소값;

rand()함수는 원래가 가짜 난수함수이다.
의사난수 라고 하는데, 발생하는 순서가
정해져 있다.

srand()는 함수 인자를 이용하 의사 난수의
발생시작 위치를 결정.
보통 srand((unsigned)time(NULL)); 사용.
time()함수는 시간을 초단위까지 정수로 반환.
NULL과 함께 사용하면 현재 시간 반환

rand() 대신 srand()를 사용하는게 아니라
rand()를 사용할 때 시작을 정해주기 위해서
srand()함수를 같이 사용하는 것이다.