잠시 위 Link 이전 부분 Review
C 에서 Array는 Python과 달리 1개의 data type만 저장할 수 있고, size가 initialize할 때 fixed 된다. 이 때, compiler가 stack array memory 할당하기가 편하다.
Array의 이름 자체는 Array의 0번째 주소다. 즉, array의 이름만 쓰면 pointer와 같은 개념이다.
Array를 function의 parameter로 넘길땐 name[ ] 이렇게 대괄호를 써서 넘긴다.
String은 Character의 Array형태 표현이다.
2D Array에서 Array[0] 은 Array 0번째 전체를 가르킨다. 즉, arr[0] 은 &arr[0][0] 과 같고 arr[1]은 &arr[1][0] 과 같다.
1. One Charcter I / O
getchar는 python의 input( ) 함수와 같다. getchar를 통해 받은 character 하나는 c 라는 variable에 저장되는 구조다.
그리고 putchar에서 숫자를 받으면 그걸 ASCII 코드로 변환해서 받는다.
getchar 함수는 유저가 무언가를 입력하는 동시에 data를 빨아서 받아버리는데,
그걸 방지하고자 Buffer를 쓴다. 즉 Enter 칠 때 까지 data를 받지 않는다.
char c1;
char c2;
printf("input c1 : \n");
c1 = getchar();
printf("input c2 : \n");
c2 = getchar();
printf("char 1 is %c, char 2 is %c \n",c1,c2);
---
input c1 :
a
input c2 :
char 1 is a, char 2 is
여기서 getchar에 a 를 치고 enter를 치면, c1에 a가 입력되고 c2는 enter를 가져가버린다.
char c1;
char c2;
printf("input c1 : \n");
c1 = getchar();
getchar();
printf("input c2 : \n");
c2 = getchar();
printf("char 1 is %c, char 2 is %c \n",c1,c2);
return 0;
input c1 :
asd
input c2 :
char 1 is a, char 2 is d
이렇게 중간에 getchar()를 넣어버리면 그 놈이 enter를 잡아 먹어서 c1 / c2 모두에 값을 입력할 수 있다.
getchar() 함수는 input을 키보드에서 바로 가져오는 것이 아니고 Buffer에서 가져온다.
2. Printf
기본적으로 string을 출력하는데, 특정 special character 같은 것들은 '%'를 이용해 변환을 해준다.
printf 에서 %를 발견하면 그 뒤에 알파벳으로 해당 자리에 올 data의 type을 파악하고, 뒤에 콤마 value를 통해 해당 data를 받은 뒤에 이것을 string으로 변환해서 화면에 띄운다.
이를 태면 printf("get %d apples",100) 이라고 했을 때, %d 라는 것을 통해 해당영역에 int가 오고, 뒤에 100을 int->string 변환하는데 참고한다.
3. Scanf
내가 입력한 값을 Variable에 할당하기 위해선 scanf에선 variable의 주소를 넘겨야 해서 &를 써준다.
단, Array의 이름만 넘기거나 Pointer를 넘기거나 할 때에는 이미 주소를 넘긴 것이라서 거기다가 또 &를 쓰면 이상한 결과가 나올 수 있으니 주의하자.
int a;
int b;
scanf("%d\n%d",&a,&b);
printf("A : %d, B:%d \n",a,b);
---
1
2
A : 1, B:2
이렇게 scanf 를 %d로 쓸 때는 편하다. %d 는 white space를 알아서 걸러주기 때문에 입력이 편하지만,
%c는 white space까지 포함시켜버리기 떄문에 주의가 요망된다.
그래서 아래의 경우 int a, b를 입력하고 enter가 buffer에 남아 있으면 scanf Char를 할 때 그 enter 값을 c에다가 입력시켜버리기 때문에, getchar() 같은 것을 넣어서 white space를 buffer에서 지워주고 다시 Char 값을 입력받는다.
int a;
int b;
int* ptrb = &b;
scanf("%d\n%d",&a,ptrb);
printf("A : %d, B:%d \n",a,b);
getchar();
char c;
scanf("%c",&c);
putchar(c);
4. File IO
Python File I O 에서의 Cursor 역할을 File Pointer가 대신해준다.
get / put / scanf / print 모두 앞에 f 를 더해서 fget / fput / fscanf / fprint 등을 써서 file에 입력하고 file에서 data를 받아온다.
EOF ( End of file ) 이라는 것은 file이 끝났음을 나타내는 Comment이다.
FILE* infile;
FILE* outfile;
char str[50];
infile = fopen("input.txt","r");
outfile = fopen("output.txt","w");
while(fscanf(infile,"%s",str) != EOF){
fprintf(outfile,"%s",str);
}
fclose(infile);
fclose(outfile);
----------in----------
i love C language
C is easier to learn than PY
----------out---------
iloveClanguageCiseasiertolearnthanPY
output file에 되게 이상하게 입력이 되었다. 띄어쓰기가 다 무시됨;;
while(fscanf(infile,"%s",str) != EOF){
fprintf(outfile,"%s ",str);
}
이렇게 while 문에 fprintf 할 때 띄어쓰기를 하나 써주면 output에 띄어쓰기가 반영이 된다.
i love C language. C is easier to learn than PY.
int main(void){
FILE* infile;
FILE* outfile;
char str[50];
char c;
infile = fopen("input.txt","r");
outfile = fopen("output.txt","w");
if(infile == NULL || outfile == NULL){
printf("ERROR \n");
return 0;
}
while((c= fgetc(infile)) != EOF){
fputc(c,outfile);
}
fclose(infile);
fclose(outfile);
그냥 이렇게 while 문에 fscanf , fprintf 말고 fgetc, fputc를 사용하면 온전히 infile data를 outfile에 옮길 수 있다.
fscanf , fprintf 를 쓰면 왜인지 모르겠는데 자꾸 output file에 text가 깨져서 저장이 된다.
얘네들은 String Type으로 써줄 때만 사용하는 것으로..
- E. O. D -
'SW 만학도 > C' 카테고리의 다른 글
Review 6 - Linked list in C (0) | 2024.07.10 |
---|---|
Review 5 - Dynamic(Structure) in C (0) | 2024.07.08 |
Review 3 - Pointer & Array in C (0) | 2024.07.04 |
Review 2 - Control Structures / Functions in C (0) | 2024.07.03 |
Review 1 - C programming basics (0) | 2024.07.03 |