레이블이 Delete Coment인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Delete Coment인 게시물을 표시합니다. 모든 게시물 표시

2015년 8월 18일 화요일

Delete Coment(주석 제거 프로그램).

간단한 주석을 제거하는 프로그램을 구현해 보았다.

프로그램 하다보면 '//' 같은 한줄 주석  '/*' 같은 여러줄 주석을 많이 사용한다.

이런 주석이 달린 파일을 받아서 주석을 제거한 파일을 만들어 보았다.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stddef.h>
#define IN 0 // in 일때는 주석안에 들어갔을때
#define OUT 1 // out 일때는 주석밖으로 나왔을때
typedef unsigned int UINT;
char* AllocateInput(FILE*fp, UINT size); // 파일에 있는 문자전체를 메모리로 복사하는 함수
void DeleteComent(char*arr, UINT size, char* newArr);// 주석을 제거하는 함수
int main() {
UINT size;
char* arr;
char* newArr = NULL;
FILE* fp;
fp = fopen("test.c", "r");
if (fp != NULL) {
fseek(fp, 0l, SEEK_END); // 파일의 마지막 을 가르키게 한다
size = (UINT)ftell(fp); //마지막을 가르키고있는 파일포인터를 size 로 받는다
rewind(fp); // 다시 파일포인터를 파일의 처음주소로 가르킨다. 
arr = AllocateInput(fp, size);  
newArr = (char*)calloc(size + 1, sizeof(char));
DeleteComent(arr, size, newArr);
fclose(fp);
free(arr);
fp = fopen("main_rmc.txt", "w");
fprintf(fp, "%s", newArr);
fclose(fp);
free(newArr);
}
return 0;
}
char* AllocateInput(FILE* fp, UINT size) { 
char* arr = NULL;
int i = 0;
arr = (char*)calloc(size + 1, sizeof(char)); // 동적 메모리 할당( main에서 받아온 size+1 만큼)
while (!feof(fp)) { //파일의 끝까지의 문자들을 만들어진 메모리에 저장
arr[i] = fgetc(fp);
i++;
}
return arr; // 메모리 주소 반환
}
void DeleteComent(char* arr, UINT size, char* newArr) {
int state = OUT;  // 처음 상태 는 OUT
char* p = arr; // 캐릭터 포인터 p 가 문자열이 저장된 배열의 첫번째를 가르킴
int i = 0;
while ((*p) != '\0') { //p가 널문자를 만날때까지 반복
if (*p == '/'&& *(p + 1) == '/') { // 한줄 주석을 만나면 IN 으로 상태를 바꿈
state = IN;  
while ((*p) != '\n') { //개행문자를 만날때까지 포인터가 간다.
p++;
}
state = OUT; // 개행문자를 만나면 다시 OUT으로 상태를 바꿈
}
else if (*p == '/' && *(p + 1) == '*') {  // 여러줄 주석을 만나면 IN 으로바꿈
state = IN;
}
else if (*p == '*'&&*(p + 1) == '/') { // 여러줄 주석의 끝을 만나면 OUT
state = OUT;
p = p + 2;  // 마지막 '*/' 를 복사하지않기 위해 포인터를 2만큼이동
}
if (state == OUT) {
newArr[i] = *p; // 새로운 배열에 p가 참조하는 값을 복사.
i++;
}
p++; // p 는 1씩증가.
}
}



실행 해보면 다음과 같이 주석이 제거된 파일을 볼 수 있다.