文字リテラル中に /* .. */ とか // が現れることは文法上ないでしょ。
lexerとか次元が違いすぎるかと。

#include<stdio.h>
#define ungetchar ungetc(c, stdin)
int main(void) {
int c;
while((c = getchar()) != -1) {
if(c == '/') {
if((c = getchar()) == '/') {
while((c = getchar()) != '\n' && c != -1)
if(c == '\r') { if((c = getchar()) != '\n') ungetchar; break; }
} else if(c == '*')
for(;;) { if((c = getchar()) == '*') { if((c = getchar()) == '/') break; ungetchar; } }
else { putchar('/'); ungetchar; break; }
} else if(c == '"') {
putchar(c);
for(;; putchar(c))
if((c = getchar()) == '\\') {
putchar(c);
c = getchar();
} else if(c == '"') { putchar(c); break; }
} else putchar(c);
}
return 0;
}