Chào các bác,
Chuyện là em có thử một bài tập về việc loại bỏ comment dạng /* … */ trong C.
Các phần khai báo cơ bản thì em nghĩ cũng dễ hiểu, chủ yếu em thắc mắc trong đoạn này:
if((outFilePtr = fopen("result.c", "w")) != NULL) //Đọc file cần check để xóa comment
{
while((c1 = fgetc(inFilePtr)) != EOF) //Check kí tự đầu tiên
{
c2 = fgetc(inFilePtr); //Lưu giá trị của kí tự tiếp theo
if((c1 == '/') && (c2 == '*')) //Nếu bắt đầu là comment với dạng /*
{
c2 = fgetc(inFilePtr);
while((c1 != '*') && (c2 != '/')) //Lần đầu chạy sẽ luôn đúng vì c1 đang ở vị trí /
{
c1 = c2;
c2 = fgetc(inFilePtr);
}
}
else // Lưu vào file mới bởi vì if đã sai
{
fputc(c1, outFilePtr);
}
}
}
Cho em hỏi như nhìn chung thì cách xử lý của em có vấn đề gì không ạ?
Chẳng hạn như ở vòng while phía trong, em xét đến trường hợp xấu nhất là chỉ có /* nhưng lại không có đóng thì while có tự động kết thúc khi đến EOF không, hay nó sẽ kiểu chạy vô tận và lỗi?
Ngoài ra, em muốn thông báo ra screen là trường hợp đó sẽ bị lỗi nếu không có đóng comment thì em đang hướng tới giải pháp sử dụng thêm if dạng như sau:
while((c1 != '*') && (c2 != '/')) //Lần đầu chạy sẽ luôn đúng vì c1 đang ở vị trí /
{
c1 = c2;
c2 = fgetc(inFilePtr);
if(c2 == EOF) //Tức là đến cuối file mà vẫn chưa có đóng comment
{
puts("Error");
}
}
Không biết có anh chị nào có thể gợi ý cho em 1 tí để mình hoàn thiện hơn được không :3