c언어 입출력함수 printf scanf와 서식문자conversion specifier

 
#include 

int main(void)
{
	int a=5;
	char s[100]="안녕";
	printf("너 %d %s\n",a, s);
	return 0;
}

여기서 %d %s 등등 을 서식문자conversion specifier라고 함%d - 10진수 정수형
%c - 단일문자
%d - 부호있는 10진수 정수형
%i - 부호있는 10진수 정수 %d와 같음(왜 따로해놨을까)
%f - 부호있는 10진수 실수
%s - 문자열
%o - 부호없는 8진정수
%u - 부호없는 10진 정수
%x - 부호없는 16진정수 소문자 사용
%X - 부호없는 16진 정수 대문자 사용
%e - e표기법에 의한 실수
%E - E표기법에 의한 실수
%g - 값에 따라서 %f %e둘 중 하나를 선택
%G - 값에 따라서 %f %E 둘중 하나를 선택
%% - %기호 출력

" " 사이에 써넣을 수 있는 특수문자
\a - 경고음발생
\b - 백스페이스backspace
\f - 폼피드form feed
\n - 라인변경
\r - 캐리지 리턴carriage return
\t - 수평탭
\v - 수직탭
\\ - 백슬레시 한글폰드에서는 원
\' - 작은 따옴표
\" - 큰따옴표

c언어 rand() srand() time() 난수생성

rand()
일정한 난수만 생성

srand()
일정한 난수생성의 시작값을 변경해주는 씨앗

time()
시간이 지날 때 마다 값이 바뀌니까 srand에 들어가서 조금 더 랜덤한 값을 만들게됨

생각한거
날씨나 웹페이지
네이버 시작페이지에서 몇번째 글자값을 숫자로 변환하는 등의 랜덤값 생성

srand(time(NULL))
time에 값을 넣어줄 수도 있는데.. 보통NULL로 하면 현재시간이 나옴

흔히 사용되는 방법은
int num;

srand(time(NULL));
num=rand()%6;
1~6까지의 숫자(주사위가 됨)

 

열혈강의C 16 도전5 배열 내림차순 정리함수

#include <stdio.h>

void DesSort(int*pArr);
int main(void)
{
int arr[7]={1, 2, 3, 5, 6, 7, 8};
int i;
printf("n1-%d", *arr);
printf("n2-%dn", arr);
printf("3-%dn", arr[0]);
for(i=0; i<7; i++)
{
scanf("%d", &arr[i]);
}
printf("n1-%d", *arr);
printf("n2-%dn", arr);
printf("3-%dn", arr[0]);

DesSort(arr);

for(i=0; i<7; i++)
{
printf(" %d ", arr[i]);
}
return 0;
}
void DesSort(int*pArr)
{
int i,j, temp;
for(j=0; j<6; j++)
{
for(i=0; i<6-j; i++)
{
if (pArr[i]<=pArr[i+1])
{
temp=pArr[i];
pArr[i]=pArr[i+1];
pArr[i+1]=temp;
}
}
}
}

c언어 변수variable 연산자 비트단위 연산자

변수선언
int a;
char b;
처럼 선언

1. c언어 변수의 이름은 알파벳,숫자,언더바 .... 곧 c언어도 한글변수명이 지원되지 않을까
2. 변수명이 대소문자 구분
3. 숫자로 시작할 수 없고 키워드 사용불가 키워드는 미리 정해진 함수 몇가지가 있다
4. 공백포함불가

연산자
= 대입
+ 더하기
- 빼기
* 곱하기
/ 나누기
% 나머지 출력

+=
-=
*=
/=
%=
이거 예
a=a+b; 이거랑 같은 뜻 a+=b;
나머지도 마찬가지

a++; //a를 보고나서 1 더하기
++a; //a에 1 더하고나서 보기
a--;
--a;

관계연산자
<
>
== 같다
!= 다르다
<=
>=

논리연산자
&& - and
|| - or
! - not

비트단위연산자
~  NOT 키보드 왼쪽위 1왼쪽에 있는넘
&  AND
^  XOR
|  OR 백스페이스 옆의 '\'와 함께 있는넘OR
<<  shift 연산 왼쪽으로 shift ( 0001101 을 <<하면 0011010 이 된다. 새로 생기는 칸은 0으로 채운다.
>>  shift 연산 오른쪽으로 shift

,(콤마)도 연산자라는듯... 별필요없을래나
연산자 우선순위도 있지만... 쓰다보면 알 수 있을래나

c언어 기본 자료형, 접미사, 상수const

































 



Bit


Byte


범위


문자형


char


unsigned char


8


8


1


1


-128 ~ 127


0 ~ 255


열거형


enum


16


2


-32768 ~ 32767


정수형


short


unsigned short


long


unsigned long


16


16


32


32


2


2


4


4


-32768 ~ 32767


0 ~ 65535


-2147483648 ∼ 2147483647


0 ∼ 4294967295


부동형


float


double


long double


32


64


80


4


8


10


±3.4e-38∼±3.4e+38


±1.7e-308∼±1.7e+308


±3.4e-4916∼±1.1e+4932


이 값이 절대적이지는 않다.

자료형을 선택 할 때는 숫자가 범위를 초과하지 않도록 선택


























 접미사 자료형 사용예
u, U  unsigned int  111U
l,  L long 111L
ul,  UL unsigned long 111UL
f,  F float 1.115F
l,  L long double 1.11L

float f = 3.14; //에러 3.14는 double형이라 데이터가 손실된다.
float = 3.14f; //통과

상수형 선언
const
const double PI = 3.14;
상수형선언은 이런식으로 표현한다.
상수는 대문자 이름을 짓는게 전통이라고 한다. 변수하고 안헷갈리게

C언어의 메모리 구조, 동적할당 malloc, callloc

프로그램이 실행되려면 메모리 공간이 필요하다.
운영체제는 프로그램을 실행시킬 때 메모리 공간을 할당 해 준다.

메모리 공간 : 스텍 Stack, 힙 heap, 데이터 data 영역

DATA 데이터 영역 - 전역변수, static변수 // 프로그램이 시작될 때 할당되어 종료될 때 까지 유지
heap 힙 영역 - 프로그래머가 할당 // ***메모리 동적 할당에서 활용되는 영역
stack 스텍 영역 - 지역변수, 매개변수 // 함수 호출이 완료되면 할당 영역이 사라진다

배열은 상수로 선언되어야 하는 이유 577p
스텍되 데이터 영역에 할당될 메모리 크기는 컴파일타임(compile-time)에 결정되야하기 때문에
누구나 한번씩 생각 해 보는 배열의 선언인...

int arr[i]
scanf("%d", &i);

이런 형태의 선언은 에러가 발생한다.

malloc 함수 & free 함수 메모리 동적 할당-----------------------581p

malloc
동적으로 메모리를 할당하는 함수--heap영역에 메모리를 할당

#include <stdlib.h>
void* malloc(size_t size)
성공시 할당된 메모리의 첫번째 주소 리턴, 실패 시 NULL포인터 리턴

사용 방법

#include
#include

void function(int);
int main(void)
{
int m=0;
fputs("배열의 크기를 입력하세요: ", stdout);
scanf("%d", &m);
function(m);

return 0;
}

void function(int i)
{
//int array[i]; //ProbArray.c에서의 문제점
int* array = (int*)malloc(sizeof(int)*i);
int j;
if(array==NULL)
{
puts("메모리 할당에 실패!");
exit(1); //비 정상적 종료를 의미함
}
/*동적 할당한 메모리 사용*/
for(j=0;j
array[j]=j+1;
for(j=0;j
printf(""%d", array[j]);
printf("\n");

free(array); // 할당된 메모리 소멸
}


calloc

#include <stdlib.h>
void *calloc(size_t elt_count, size_t elt_size)
성공 시 할당받은 메모리의 포인터(void*형), 실패 시 NULL 리턴


malloc 과 사용방법은 거의 동일하다.

int *arr = (int*)calloc(size,sizeof(int));
==
int *arr = (int*)malloc(size*sizeof(int));

파일 입출력 Random Access

#include <stdio.h>
int fseek(FILE * stream, long offset, int wherefrom)

fseek(stream, 2, SEEK_CUR) // 이런 형식으로 입력

wherefrom의 전달인자
SEEK_SET 이라면 파일의 맨 앞으로 이동한다.
SEEK_CUR 이라면 이동하지 않는다. // SSEK_CUR은 현재 위치를 기준으로 이동한다.
SEEK_END 이라면 파일의 끝으로 이동한다.

long offset 위치의 숫자를 +-숫자로 지정해서 앞뒤로 이동

SEEK_SET(SEEK_END)을 전달하면 현재의 파일 위치 지시자의 위치에 상관없이 파일의 맨 앞(뒤)을 기준으로 fseek함수의 두 번째 인자의 크기만큼 이동한다.

SEEK_CUR

파일 입출력 함수

파일 입 출력 함수들






























  키보드/모니터 선택(키보드/모니터,파일)
문자출력 int purchar(int c) int fputc(int c, FILE* stream)
문자입력 int getchar(void) int fgetc(FILE* stream)
문자열 출력 int puts(const char* s) int fputs(const char* s, FILE* stream)
문자열 입력 char* gets(char* s) char* fgets(char* s,int n, FILE* stream)
형식 지정 출력 int printf(const* format, ...) int fprintf(FILE* stream, cnost char* format,...)
형식 지정 입력 int scanf(const char* format, ...) int fscanf(FILE*stream, const char* format,...)

puts("Dont' worry!"); // puts는 모니터상으로 출력
fputs("dont'w worry!\n", stdout); // stdout 스트림을 활용 모니터에 출력
fputs("dont worry!\n", file); // file 스트림을 활용.. fopen을 통해 개방된 파일에 저장

char buf[30];

fputs("데이터 입력: ", stdout);
fgets(buf, sizeof(buf), stdin); //buf 배열에 stdin을 통해 문자열을 입력 후 ENTER
puts(buf); //buf에 저장된 문자열을 출력

fgets(buf,sizeof(buf), file); // buf배열에 file의 문자열을 buf의 크기 한도 내에서 저장
puts(buf); // buf를 출력

파일 입 출력 함수와 FILE 구조체 변수----------------------------
파일위치 지시자...File Position Indicator
fgetc, fgets등을 여러번 호출하면 이전에 호출했던 위치에서 이어서 호출이 된다.
이러한 일이 가능한 것은 파일을 어디까지 읽었는지 어디까지 섰는지 그 위치를 기억하고 있다는 뜻.

= 파일을 개방하는 경우 이에 대한 FILE 구조체 변수의 포인터가 리턴되고, 그 포인터가 가리키는 구조체 변수 내에는 '파일 위치 지시자'에 해당하는 변수가 존재한다. 이 변수는 파일 내의 위치 정보를 지니고 있으며, 이 변수의 값은 파일에서부터 데이터를 읽거나 쓰는 경우 변경된다.

--------------파일의 끝에 도달한 경우 리턴------------
fgetc --> EOF(-1)을 리턴
fgets --> NULL포인터 (0)
fscanf --> EOF(-1)

----------feof  파일의 끝을 검사하는 함수---------
#include <stdio.h>
int feof(FilE*stream)

~~~~~~~~~~~~~~
file=fopen("Test.txt","rb"); //읽기전용 파일 개방
if(file==NULL){
  printf("file open error!\n");
  return 1;
}

while(1)
{
  ch=fgetc(file);
  if(feof(file)!=0)  //feof함수를 활용해 파일을 끝을 검사하고 break로 종료
    break;
  printf("data : %c \n", ch);
}
//여기서 파일을 종결하면 됨
state=fclose(file);
if(state!=0){
  printf("file close error!\n");
  return 1;
}
return 0;

파일입출력 - 파일의 개방 open 종결 close

fopen함수 - 파일 개방

#include <stdio.h>
FILE* fopen (const char * filename, const char * mode)
성공 시 해당 파일의 파일포인터, 실패시 NULL 포인터 리턴


fclose함수 - 파일 종결

#include <stdio.h>
int fclose (FILE * stream)
종료가 오류 없이 제대로 이뤄지면 0을 리턴


사용 예

#include <stdio.h>
int main(void)
{
  int state;
  FILE*file=fopen("c:\\work\\test.txt", "rt"); //파일 개방
  if(file==NULL){
    printf("file open error\n");
    return 1;
  }
  state=fclose(file);  //파일의 종결
  if(state!=0){
    printf("file close error!\n");
    return 1;
  }
return 0;
}


파일 접근 모드
r - 읽기전용
w - 쓰기전용, 파일이 없으면 새로 생성, 파일이 있으면 기존파일을 지우고 생성
a - 파일의 끝에서 내용추가 전용
r+  -파일을 읽고 쓰기, 파일이 존재하지 않으면 새로운 파일 생성, 파일이 존재하면 데이터를 덮어쓰기
w+ - 파일을 읽고 쓰기, 파일이 존재하지 않으면 새로운 파일 생성, 파일이 존재하면 기존파일을 지우고 생성
a+ - 파일을 읽고 쓰기, 파일이 존재하지 않으면 새로운 파일 생성, 파일이 존재하면 끝에서부터 데이터 추가

데이터 입출력 모드 541p
t - 텍스트 모드
b - 바이너리 모드(2진 모드)

main 함수 인자 전달 int main( int argc, char**argv)

int main( int argc, char*argv[])

tar zxvf game.tar.gz
tar이라는 실행파일에
(1) tar (2) zxvf (3) game.tar.gz
3개다. int argc는 3이 전달된다.
char*argv[3] 세개의 문자열을 꺼내서 쓸 수 있다.... 아마도...

main.exe 파일 실행시에...
main 샘슝 꼬랐다  //3개의 문자열
main 애미콜좆다 //2개의 문자열
main "샘슝 꼬랐다" //2개의 문자열
참고...

if문을 통해 인자의 수를 제대로 입력했을 경우에만 실행되도록...
if (argc != 3)
{

  printf("사용방법이 잘못됐다");

  return 1; //이걸로 종료시켜버린다.
}