Exercise 1.23 - Remove comments from a C program¶
Question¶
Write a program to remove all comments from a C program. Don’t forget to handle quoted strings and character constants properly. C comments don’t nest.
Solution¶
/* Exercise 1.23
*
* Program to remove comments from a C Program.
*
* Program should echo quotes and character constants properly
* C comments do not nest
*
*/
#include <stdio.h>
void rcomment(int c);
void incomment(void);
void echo_quote(int c);
int main(void) {
int c, d;
printf(" To Check /* Quoted String */ \n");
while ((c = getchar()) != EOF)
rcomment(c);
return 0;
}
void rcomment(int c) {
int d;
if (c == '/') {
if ((d = getchar()) == '*')
incomment();
else if (d == '/') {
putchar(c);
rcomment(d);
} else {
putchar(c);
putchar(d);
}
} else if (c == '\'' || c == '"')
echo_quote(c);
else
putchar(c);
}
void incomment() {
int c, d;
c = getchar();
d = getchar();
while (c != '*' || d != '/') {
c = d;
d = getchar();
}
}
void echo_quote(int c) {
int d;
putchar(c);
while ((d = getchar()) != c) {
putchar(d);
if (d == '\\')
putchar(getchar());
}
putchar(d);
}
Explanation¶
If two subsequent characters start with / and *, we say we are in-comment, If we find two characters which are / and /, we will print the first character and start treating the second / as the possible start of comment. In the same manner, if we encouter a single quote or a double quote character, then we understand we are inside a quoted string, so we putchar everything before we find the matching character again. Within a quoted string, if we encouter a special character, then we try to read them literally as two characters and print them.
If / is followed by any other character, we simply print them.