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씩증가.
}
}



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


0 개의 댓글:

댓글 쓰기