Problem
Solution
We need to remove all the C comments. There are two types of comments
/*
*/
//
We should not remove it when we are inside a string. Strings are always found inside "".
First we need to find whether we are inside a sting.
If we are inside a string we should not apply the C comment removal method.
We need to remove all the characters inside /* */
it and replace it with white-space.
And all the charters inside //
till end of the line and replace it with space and newline.
Putting all the above idea into C program it would look as follows
#include <stdio.h> enum com_type_t { NOT_COMMENT = 0, COMMENT_SINGLE_LINE = 1, COMMENT_MULTI_LINE = 2}; #define is_not_com() (com == NOT_COMMENT) int main() { int is_str = 0; int ch = -1, pch = -1; enum com_type_t com = NOT_COMMENT; while((ch = getchar()) != EOF) { if(ch == '"' && is_not_com()){ is_str = ~is_str; } if(!is_str && is_not_com() && ch == '/' && pch == '/') { com = COMMENT_SINGLE_LINE; }else if(!is_str && is_not_com() && ch == '*' && pch == '/') { com = COMMENT_MULTI_LINE; } if(is_not_com() && pch != -1) { putchar(pch); } if(!is_str && com == COMMENT_SINGLE_LINE && ch == '\n') { putchar(' '); com = NOT_COMMENT; }else if(!is_str && com == COMMENT_MULTI_LINE && ch == '/' && pch == '*') { ch = ' '; com = NOT_COMMENT; } pch = ch; } }
Links
- Next Article - K & R : Exercise 1.24 - Rudimentary C syntax checker
- Previous Article - K & R : Exercise 1.22 - Fold long lines
- All Article - K & R Answer
No comments :
Post a Comment