菜鸟小问,老鸟帮帮!

erwinrommel 2004-04-28 05:01:30
清楚注释算法:例如------
001.cpp中有如下内容:
===============================================
// 001.cpp
/* 注释
*/

#include<iostream>
using namespace std;

int main( )
{
char *a="/*";
char *b="*/";
cout<<"/*Hello World";// 注释
cout<<"//Hello China"; // 注释
return 0;
}
=====================================================
要求把注释全部删除掉,重新输出,由于情况太多,本人未得其解,现高分求教;
本人QQ:254343602
先答出者给分,只给一人(满100分);
...全文
124 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
erwinrommel 2004-05-09
  • 打赏
  • 举报
回复
谢谢大家的帮忙
fflush 2004-05-08
  • 打赏
  • 举报
回复
to cngdzhang()
再次运行你的测试程序,的确得到了你的结果,可能我上次运行之前改了你的测试程序,但是我自己忘记了,问题出在这:
char e='"';
我的程序认为正确的格式应该是char e = '\"'; 但是你的写法是可以通过编译的。现在将源代码修改如下
#include <string>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
ifstream infile("e:\\cppout\\tt.cpp");
ofstream outfile("e:\\cppout\\tt$.cpp");
string line;
string::size_type pos, comment_pos;
bool Valid = true;
bool Comment = false;

if( !infile )
{
cerr << "File can not open!\n";
return 0;
}
if( !outfile )
{
cerr << "File can not write!\n";
return 0;
}

while (getline (infile, line, '\n') )
{
comment_pos = pos = 0;
while ( (pos = line.find_first_of ("\"\'/\\", pos)) != string::npos )
{
char c = line[pos];
switch( c )
{
case '\\' :
pos++;
break;
case '\'' ://加了这些,用于解决上述问题
if( Comment )
break;
if( line[++pos] == '\\' ) ++pos;
++pos;
break;

case '\"' :
if( !Comment )
Valid = !Valid;
break;
case '/' :
if( Valid )
{
if( pos != line.size()-1 && line[pos+1] == '/' )
line.erase (pos, string::npos);

if( Comment && pos && line[pos-1] == '*' )
{
line.erase (0, pos+1);
Comment = false;
break;
}
if( !Comment && pos != line.size()-1 && line[pos+1]=='*' )
{
comment_pos = pos;
Comment = true;
break;
}
}
break;
}
pos++;
}
if( Comment )
line.erase(comment_pos);

outfile << line;
outfile << '\n';
}

infile.close();
outfile.close();
}
cngdzhang 2004-05-06
  • 打赏
  • 举报
回复
我是在vc底下测试的
下面的这个测试输入是合法的,但是你的程序输出的不是,象你说的那个结果,
你能把你的程序再粘一遍吗?


// 001.cpp
/* 注释
*/

#include<iostream>
using namespace std;

int main( )
{
char *a="/*";
char *b="*/";
char c[10]="\""; //
char d='\''; //djkhfksd
char e='"';
char f[10]="\\";
char g[10]="\\\"";
/*
"dshfjk
jhdfjkd"
*/
//djflkjds
cout<<"/*Hello World";// 注释
cout<<"//Hello China"; // 注释
return 0;
}
fflush 2004-05-06
  • 打赏
  • 举报
回复
谢谢大家对我的指正
to cngdzhang() 我运行你的测试程序,结果是
#include<iostream>
using namespace std;

int main( )
{
char *a="/*";
char *b="*/";
char c[10]="\"";
char d='\'';
char e='\"';
char f[10]="\\";
char g[10]="\\\"";





cout<<"/*Hello World";
cout<<"//Hello China";
return 0;
}
这没有问题,我也不清楚你是如何得到你的那个结果的,但是有一点需要注意,被测试的程序一定是被编译通过的合法程序。
to zhouqingyuan(浪帆) 我考虑你所说的那个,要是不考虑,肯定就没现在这么复杂了:)
程序也没有经过很多的测试,所以可能还有问题,欢迎大家继续指正
cngdzhang 2004-04-29
  • 打赏
  • 举报
回复
帮人帮到底
我上面的那个也不行

这个是没问题的了

#include <stdio.h>

void main()
{
int isInStr=0,isInChar=0,isInChange=0;
FILE *fin,*fout;
char oldc=-1,c;
fin=fopen("data.txt","rb");
fout=fopen("dataout.txt","wb");
while(!feof(fin))
{
c=fgetc(fin);
if(oldc=='/' && c=='*' && !isInStr)
{
do
{
oldc=c;
c=fgetc(fin);
}while(!(oldc=='*' && c=='/'));
c=fgetc(fin);
}
if(oldc=='/' && c=='/' && !isInStr)
{
do
{
oldc=c;
c=fgetc(fin);
}while(c!='\r');
}
if(c=='"' && !isInChar && !isInChange) isInStr=!isInStr;
if(c=='\'' && !isInStr && !isInChange) isInChar=!isInChar;
if(isInChange) isInChange=0;
else if(c=='\\') isInChange=1;
oldc=c;
c=fgetc(fin);
ungetc(c,fin);
if(oldc=='/' && (c=='*' || c=='/') && !isInStr)
continue;
fputc(oldc,fout);
}
fclose(fin);
fclose(fout);
}
cngdzhang 2004-04-29
  • 打赏
  • 举报
回复
fflush(stdin)的程序有问题

输入
===========================================================
// 001.cpp
/* 注释
*/

#include<iostream>
using namespace std;

int main( )
{
char *a="/*";
char *b="*/";
char c[10]="\""; //
char d='\''; //djkhfksd
char e='"';
char f[10]="\\";
char g[10]="\\\"";
/*
"dshfjk
jhdfjkd"
*/
//djflkjds
cout<<"/*Hello World";// 注释
cout<<"//Hello China"; // 注释
return 0;
}
==========================================================

输出的是
===========================================================




#include<iostream>
using namespace std;

int main( )
{
char *a="/*";
char *b="*/";
char c[10]="\"";
char d='\'';
char e='"';
char f[10]="\\";
char g[10]="\\\"";
/*
"dshfjk
jhdfjkd"
*/
//djflkjds
cout<<"



========================================================
erwinrommel 2004-04-28
  • 打赏
  • 举报
回复
谢谢各位解答,我现在已经弄明白了。但分数只能给其中的一位,对于其余提供帮助的大虾,我感到抱歉!我的QQ是254343602,有兴趣一同探讨C++的可以加我的QQ,我将非常欢迎!感谢各位高手的帮助!(鞠躬)^_^
erwinrommel 2004-04-28
  • 打赏
  • 举报
回复
pos != _file_tem_buf.length( )-1 是什么意思?
tomren 2004-04-28
  • 打赏
  • 举报
回复
而且是一个比一个长!!!
tomren 2004-04-28
  • 打赏
  • 举报
回复
真长!!!up!
zhouqingyuan 2004-04-28
  • 打赏
  • 举报
回复
要注意的就是:
//或者/*这种符号如果出现在字符串当中,那么上面的程序好象就有问题了。
比如在printf("/*djkfdk//dkfjd/*");这种类型的,要考虑是不能去掉的。上面的那个C++写的好象就没有考虑这个问题。
erwinrommel 2004-04-28
  • 打赏
  • 举报
回复
楼上的,怎么搜索?
zhouqingyuan 2004-04-28
  • 打赏
  • 举报
回复
N久之前就有人在这里提过这个问题的,而且也得到解决的。
为什么不先去搜索一下旧帖子。
newegg2002 2004-04-28
  • 打赏
  • 举报
回复
看样子100分已经被拿走了..?
呵..
fflush 2004-04-28
  • 打赏
  • 举报
回复
上面各位老鸟都是用c写的,偶献上标准c++的版本
#include <string>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
ifstream infile("e:\\cppout\\tt.cpp");
ofstream outfile("e:\\cppout\\tt$.cpp");
string line;
string::size_type pos, comment_pos;//comment_pos纪录注释(/*)起始点
bool Valid = true; //标志当前字符是否有效,即字符不在用户定义字符串或字符中
bool Comment = false; //标志当前是否处于/*……*/注释块中

if( !infile )
{
cerr << "File can not open!\n";
return 0;
}
if( !outfile )
{
cerr << "File can not write!\n";
return 0;
}

while (getline (infile, line, '\n') )//按行读入数据
{
comment_pos = pos = 0;
while ( (pos = line.find_first_of ("\"\'/\\", pos)) != string::npos )
//从pos开始寻找("\"\'/\\"中的任何一个字符
{
char c = line[pos];
switch( c )
{
case '\\' :
pos++; //下一个字符将是转义字符,跳过
break;
case '\"' : case '\'' :
if( !Comment ) //如果不在注释中,则标记处于字符串中,或者跳出字符串
Valid = !Valid;
break;
case '/' :
if( Valid )
{
//找到//的注释,直接去掉后面的内容
if( pos != line.size()-1 && line[pos+1] == '/' )
line.erase (pos, string::npos);
//找到*/,去掉当前行前面的内容,标记处于注释外
if( Comment && pos && line[pos-1] == '*' )
{
line.erase (0, pos+1);
Comment = false;
break;
}
//找到/*,标记处于注释里面,记录注释开始位置
if( !Comment && pos != line.size()-1 && line[pos+1]=='*' )
{
comment_pos = pos;
Comment = true;
break;
}
}
break;
}
pos++;
}
//如果这行是注释行,去掉当前行
if( Comment )
line.erase(comment_pos);
//写文件
outfile << line;
outfile << '\n';
}

infile.close();
outfile.close();
}
cngdzhang 2004-04-28
  • 打赏
  • 举报
回复
注意,我的输入文件名是data.txt,输出文件名是dataout.txt,而且我没有检测文件是否正确打开,你使用时要注意哦
if(!fin)
{
printf("Error !,Can't open file for read.\n")
}
if(!fout)
{
printf("Error !,Can't open file for write.\n")
}

你给的输入,相应的输出是


#include<iostream>
using namespace std;

int main( )
{
char *a="/*";
char *b="*/";
cout<<"/*Hello World";
cout<<"//Hello China";
return 0;
}
cngdzhang 2004-04-28
  • 打赏
  • 举报
回复
我写了一个,应该行了

输入data.txt

#include<iostream>
using namespace std;

int main( )
{
char *a="/*";
/*djfkh
"hdsfkj"
*/
char *b="*/";
cout<<"/*Hello World";// 注释
cout<<"//Hello China"; // 注释
return 0;
}



输出dataout.txt

#include<iostream>
using namespace std;

int main( )
{
char *a="/*";

char *b="*/";
cout<<"/*Hello World";
cout<<"//Hello China";
return 0;
}

源程序:

#include <stdio.h>

void main()
{
int isInStr=0;
FILE *fin,*fout;
char oldc=-1,c;
fin=fopen("data.txt","rb");
fout=fopen("dataout.txt","wb");
while(!feof(fin))
{
c=fgetc(fin);
if(oldc=='/' && c=='*' && !isInStr)
{
do
{
oldc=c;
c=fgetc(fin);
}while(!(oldc=='*' && c=='/'));
c=fgetc(fin);
}
if(oldc=='/' && c=='/' && !isInStr)
{
do
{
oldc=c;
c=fgetc(fin);
}while(c!='\r');
}
if(c=='"') isInStr=!isInStr;
oldc=c;
c=fgetc(fin);
ungetc(c,fin);
if(oldc=='/' && (c=='*' || c=='/') && !isInStr)
continue;
fputc(oldc,fout);
}
fclose(fin);
fclose(fout);
}

fanbest 2004-04-28
  • 打赏
  • 举报
回复
糟糕了,忘了加上循环语句。

反正就是循环读文件,一直读到文件结束为止。

不好意思,我现在在网吧上网,没有编程环境,只好乱写一通。

楼主如果想要完整程序的话,有空加我QQ
11606200
fanbest 2004-04-28
  • 打赏
  • 举报
回复
压栈呗;

反正// /* */之类的东东只能出现在" "之中。我们只需要判断/*之类的在不在" "中,

如果不在,则将之后的内容统统不压栈;直到出现*/为止。


定义个数据结构栈S和Q;Q用来存放/*之类的内容S来存放.CPP文件的内容
fileopen("filename.cpp",ios:in|ios:out)
bool Enable;//如果为真就要将字母不断压下去
bool Notice;//出现/*之类与否
bool Nc;是否出现了'"'符号
read((char *)&a,sizeof(char));

if(a=='"')
if(Nc)
Nc=false;
else
Nc=true;
if(a=='//'&&!Nc&&Enable)
enable=false;
if(!enable)
{
char *b=GetTop(Q);
char *c=GetButtom(Q)+1;
if(*c=='//'&&b==(回车的ARC码值,不好意思,忘掉了))
{
push(S,a);
clear(Q);
enable=true;
}
if(*c=='*'&&*b=='//‘&&*(b-1)=='*')
{
clear(Q);
enable=true;
}
if(enable)
push(S,a);
else
push(Q,a);


liushuaiboy 2004-04-28
  • 打赏
  • 举报
回复
不懂楼主的意思~~
加载更多回复(2)

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧