#include<stdio.h>
#include <stdlib.h>
#include<stdbool.h>
int lines;
void m_cmnt(FILE *fp)
{
int prev = 0;
int ch;
while ((ch = getc(fp)) != EOF)
{
if (prev == '*' && ch == '/')
{
return;
}
else
{
prev = ch;
}
}
fprintf(stderr, "error in line %d: unterminated comment\n", lines+1);
}
int main ( int c , char **arr )
{
FILE *fp , *np ;
int ch , prev ;
lines = 0;
bool String=0 ;
fp = fopen("test.txt", "r") ;
np = fopen("temp.txt" , "w") ;
if (fp==NULL )
{
printf ("Invalid/No Filename given as Argument ! \n") ;
return 1 ;
}
while ((ch=getc(fp))!=EOF )
{
if (ch == '\n')
lines++;
/* file pointer currently not inside a string */
if ( !String )
{
if ( ch=='/' )
{
prev=ch ;
ch= getc(fp) ;
switch(ch)
{
case '*' : /*if(ch != 'a')
putc('h', np);*/
m_cmnt( fp) ;
putc(' ', np);
break ;
default :
putc(prev , np) ;
putc(ch , np) ;
break ;
}
}
else putc( ch ,np ) ;
}
else putc(ch , np) ;
if ( ch=='\"' || ch=='\'')
String = !String ;
prev = ch ;
}
fclose(fp) ;
lines++;
printf("line = %d", lines);
fclose(np) ;
//remove(arr[1]) ;
//rename( "temp.txt" , arr[1] ) ;
return 0 ;
}
我和我的朋友正在做一个自我挑战项目,上面的代码是一个程序,该程序从“ test.txt”文件中删除注释,并将非注释部分写入temp.txt文件。它仅适用于多评论(有意)。
我试图处理\ n字符以在注释内部和注释外部出现换行符。例如,line1\nline2
应该以不同的行导出。 line1/*comm\nent*/line2
也应以不同的行导出(写入)。但是,如果转义字符出现在字符串或字符文字中,则应将其视为普通字符串或字符。
答案 0 :(得分:1)
删除评论的程序
代码需要一种新的方法来健壮地处理"\""
,"\'"
,'\"'
,'\''
,// '
,/* " */
,{ {1}}等。
通常,您至少有5种状态:正常,"//"
字符串,""
常量,''
注释,/* */
注释。
建议重新设计算法。
// eol
所有赌注都没有了,因为代码做了类似// Pseudo code
while ((c=get()) != EOF) {
if (c == ''') process_quote();
else if (c == '"') process_double_quote();
else if (c == '/') {
next = fgetc()
switch (next) {
case '*': process_slash_star_comment();
case '/': process_slash_slash_comment();
default: unget(next); put('/');
else put(c)
}
的事情。
答案 1 :(得分:0)
以下代码应做您想要的(未经测试/未经检查)
// TODO: includes
FILE *fp;
bool expect(int c) {
int d = fgetc(fp);
if (d == c) return true;
fungetc(d, fp);
return false;
}
// handle things differently while inside a string/char literal.
void quoted(int q) {
while (true) {
if (expect(q)) break; // found matching quote, leave the function
// skip over character escape sequences
// FIXME: does not handle multi-character escape sequences correctly
if (expect('\\')) putchar('\\');
putchar(fgetc(fp)); // NOTE: will also print character after '\\'
}
}
// In response to the comment
bool escnl(void) {
if (expect('\\')) {
if (expect('n')) {
putchar('\n'); // found \n!
return true;
}
fungetc('\\', fp); // found backslash but not a \n
}
return false;
}
int main(void) {
// TODO: initialization
while (true) {
if (expect('/')) {
if (expect('*') { // found a comment!
while (true) { // search for the end
// if (expect('\n')) putchar('\n'); // emit newlines in comments, as requested // commented out as per answer comment
if (expect('*') && expect('/')) break; // found the end!
if (!escnl()) fgetc(fp);
}
}
else putchar('/'); // found a slash, but wasn't a comment
}
else if (expect('\"')) quoted('\"');
else if (expect('\'')) quoted('\'');
else if (expect(EOF)) break;
else if (!escnl()) putchar(fgetc(fp));
}
// TODO: cleanup
return 0;
}