⑴ 打开带有注释的C语言源程序文件,显示过滤掉注释后文件内容.
大体思路吧,做一个标记,遇到/*做一个标记(因为C语言只有/**/注释,如果是C++的话//也是注释),此标记为真时不向另一个文件中写入,遇到*/时标记为假,则断续写入就OK了
⑵ C语言将TXT文件中的注释过滤掉,求大神帮忙修改~分不是问题
我先mark一下,周末写。
不过理论上不应该是你说的那样
遇到/*而没有后面的*/,则将/*后面的消除---------------这个是不对的
删除注释,前提应该是你的cpp可以编译,不可能出现这种有/*而没有*/的情况,如果简单粗暴地将/*之后的全部删除,那修改后的文件就不知道错到哪里去了
/************************************************************************
*本程序需要以dos命令行形式打开,支持txt格式
*file1和file2以绝对路径表示,用法为del.exeoldfile.txtnewfile.txt,例如:
*D:????>DelComments.exee:BPALTask.txte:NewFile.txt
/************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#defineMAX_BUFF_LEN1024
#defineMAX_FNAME_LEN256
/*************************************************************************/
//删除文件中的注释,这个文件本身应该没有错误,尤其是引号要匹配,"/*"和"*/"要匹配
//算法大体上应该如下:
//步骤1:读取一行,查找"//",若找到,则删除这一行中"//"后所有的部分
//步骤2:读取一行,查找"/*",若找到,记录pos1,删除pos1到本行末尾,重新读取一行,
//查找"*/",若找到,记录pos2,删除本行0到pos2之间的部分
//重复步骤1和2
//需要考虑的特殊情况有:
//处于双引号中,如"/","*","//"不计入考虑范围
//处于单引号中,如'/','*','//'不计入考虑范围
//"//"与"/"的嵌套关系
/************************************************************************/
voidDelComments(FILE*pFile,FILE*tempFile)
{
charbuff[MAX_BUFF_LEN]={0};
char*pCur=NULL;//当前字符
char*pNext=NULL;//下一字符
char*sqStart=NULL;//单引号起始位置
char*dqStart=NULL;//双引号起始位置
char*scStart=NULL;//单行注释起始位置
char*dcStart=NULL;//多行注释起始位置
unsignedcharlen=0;
while(NULL!=fgets(buff,MAX_BUFF_LEN,pFile))
{
pCur=buff;
while(' '!=*pCur)
{
switch(*pCur)
{
case'/':
if(sqStart||dqStart||scStart||dcStart)
{//忽略字符、字符串以及注释中的斜杠
pCur++;
}
else
{
pNext=pCur+sizeof(char);
if('/'==*pNext)
{//单行注释
dcStart=pCur;
pCur=pNext+sizeof(char);
}
elseif('*'==*pNext)
{//多行注释
scStart=pCur;
pCur=pNext+sizeof(char);
}
else
{//除号
pCur++;
}
}
break;
case'*':
if(sqStart||dqStart||dcStart||(NULL==scStart))
{//忽略字符、字符串以及注释中的星号,忽略乘号
pCur++;
}
else
{
pNext=pCur+sizeof(char);
if('/'!=*pNext)
{//多行注释中间的星号,不处理
pCur++;
}
else
{
memset(scStart,'',pNext+sizeof(char)-scStart);
scStart=NULL;
}
}
break;
case'"':
if(sqStart||scStart||dcStart)
{//忽略字符以及注释中的双引号
pCur++;
}
else
{
if(dqStart)
{//双引号匹配成功
dqStart=NULL;
pCur++;
}
else
{
dqStart=pCur;
pCur++;
}
}
break;
case''':
if(dqStart||scStart||dcStart)
{
pCur++;
}
else
{
if(sqStart)
{
len=pCur-sqStart;
if((2*sizeof(char)==len)&&('\'==*(pCur-1)))
{//忽略字符中的单引号
pCur++;
}
else
{
pCur++;
sqStart=NULL;
}
}
else
{
sqStart=pCur;
pCur++;
}
}
break;
default:
pCur++;
break;
}
}
//读到换行符后,进行相应操作
if(dcStart)
{
len=((*(pCur-sizeof(char))==' ')?(pCur-sizeof(char)):pCur)-dcStart;
memset(dcStart,'',len);
dcStart=NULL;
}
if(sqStart)
{
sqStart=buff;
}
if(dqStart)
{
dqStart=buff;
}
if(scStart)
{
memset(scStart,'',pCur-scStart);
scStart=buff;
}
fputs(buff,tempFile);
}
}
intmain(intargc,char*argv[])
{
FILE*pFile=NULL;
FILE*newFile=NULL;
if(argc<3)
{
fprintf(stderr,"usage:%s[OLD_FILE_NAME][NEW_FILE_NAME] ",argv[0]);
exit(1);
}
if(NULL==(pFile=fopen(argv[1],"r+")))
{
fprintf(stderr,"openfilefailed ");
exit(2);
}
if(NULL==(newFile=fopen(argv[2],"w+")))
{
fprintf(stderr,"createnewFilefailed ");
exit(3);
}
DelComments(pFile,newFile);
fclose(pFile);
fclose(newFile);
return0;
}
⑶ c语言文件将一个.c文件1复制到另一个文件2中,要求过滤掉文件1中的注释。求解。
#include<stdio.h>
#include<stdlib.h>
voidFilechuzhushi(char*sourceFileName,char*destFileName)
{
charch1,ch2,chTemp,s[1000];
FILE*sourcefPtr,*destfPtr;
if((sourcefPtr=fopen(sourceFileName,"r"))==NULL)
("can'topenthesourcefile ");
elseif((destfPtr=fopen(destFileName,"w"))==NULL)
printf("can'topenthedestfile ");
else{
ch1=fgetc(sourcefPtr);//从源文件读取一个字符
while(!feof(sourcefPtr))
{//逐字符复制
//changebegin----------------------------
if('/'==ch1)
{
ch2=ch1;
ch1=fgetc(sourcefPtr);
if('/'==ch1||'*'==ch1)
{
fseek(sourcefPtr,-2,SEEK_CUR);
fgets(s,sizeof(s),sourcefPtr);
ch1=fgetc(sourcefPtr);
puts(s);//打印注释,以便调试
}
else
{
fputc(ch2,destfPtr);
}
}
else
{
fputc(ch1,destfPtr);//将字符写入目标文件
ch1=fgetc(sourcefPtr);
}
//changeend------------------------------
}
fclose(sourcefPtr);
fclose(destfPtr);
}
}
intmain()
{
Filechuzhushi("1.c","2.c");
system("pause");
return0;
}
稍微测试了下,应该是可行的 主要在对'/'和'*'的判断这部分做了修改 试试吧
⑷ eclipse如何过滤只显示.c和.h文件
无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被内开发环境检测到,容并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那么容易被发现了,通常逻辑错误的定位和分析是一件非常困难的事情。
所以在学习Android过程中,继学习它的程序结构,写了HelloWorld和一些简单的界面布局程序之后,我选择研究一下它的调试工具。
LogCat就是其中一个。LogCat是用来获取系统日志信息的工具,它可以捕获的信息包括Dalvik虚拟机产生的信息,进程信
息,ActivityManager信息,PackagerManager信息,Android运行时信息和应用程序信息等等。
我们可以在打开Eclipse之后,选择Window –> Show View ->Other菜单,然后在Android->LogCat中选择LogCat,这样LogCat便会在Eclipse的下方区域出现了。
⑸ 将一个.c文件1复制到另一个文件2中,要求过滤掉文件1中的所有注释
刚写的,测试过了,你试下看!
private void button10_Click(object sender, EventArgs e)
{
string text = "";
//读出流,把值一行行的读出来
using (StreamReader reader = new StreamReader("D:\\a.c"))
{
string line = reader.ReadLine();
while (line != null)
{
//查找到你写注释符号的地方
int count = line.IndexOf("//");
string value = "";
if (count >= 0)
{
//把注释符号后面的都切掉
value = line.Substring(0, count);
}
else
//没有的话就保存原值
value = line;
text += value + "\r\n";
line = reader.ReadLine();
}
}
//从写入流将值写入B中去
using (StreamWriter writer = new StreamWriter("D:\\b.c"))
{
writer.Write(text);
writer.Flush();
writer.Close();
}
}
⑹ c语言如何过滤去非16进制的字符
||#include<stdio.h>
void main()
{
char str[100];
int t,i=0;
printf("请输入一个字符串\n");
gets(str);
for(t=0;str[t]!版='\0';t++)
if(('A'<=str[t]&&str[t]<='F')||权('a'<=str[t]&&str[t]<='f')||('0'<=str[t]&&str[t]<='9'))
str[i++]=str[t];
str[i]=0;
printf("%s\n",str);
}
⑺ C语言设计函数将文件过滤注释
用正则表达式
⑻ c语言过滤注释问题
#include<stdio.h>
intmain()
{
FILE*fp1,*fp2;
charch1,ch2,str[100];
if((fp1=fopen("test1.c","r"))==NULL)
{
("Can'topenthefile!");
exit(0);
}
else
{
if((fp2=fopen("test2.c","w"))==NULL)
{
printf("Can'topenthefile!");
exit(0);
}
else
{
/*两个文件都正常打开*/
ch1=fgetc(fp1);
while(!feof(fp1))
{
/***************mychangebeginshere******************/
if(ch1=='/')
{
/*将当前字符赋给ch2,ch1继续读取下一个字符来做判断*/
ch2=ch1;
ch1=fgetc(fp1);
/*继续判断ch1所读取到的字符*/
if(('/'==ch1))
{
/*已经到文件尾了*/
if(feof(fp1))
{
break;
}
/*注释格式为//,将该行读取出来,让文件指针偏移到注释行的下一个字符*/
fseek(fp1,-2,SEEK_CUR);
fgets(str,sizeof(str),fp1);
ch1=fgetc(fp1);
}
elseif('*'==ch1)
{
/*已经到文件尾了*/
if(feof(fp1))
{
break;
}
/***注释格式为/**/,循环读取直至注释结束符*/****/
do
{
ch2=ch1;
ch1=fgetc(fp1);
}while((('*'!=ch2)||('/')!=ch1)&&(!feof(fp1)));
/*注释部分已经读取完毕,ch1继续读取其下一个非注释字符,并写入fp2*/
ch1=fgetc(fp1);
fputc(ch1,fp2);
}
else
{
/*若不是注释符,则将原先读取到的字符写入文件中*/
fputc(ch2,fp2);
}
}
else
{
/*若没遇到,正常复制,继续读取下一个字符*/
fputc(ch1,fp2);
ch1=fgetc(fp1);
}
/****************mychangeendshere*******************/
}
}
}
fclose(fp1);
fclose(fp2);
return0;
}
小伙子 自己测试一下吧 应该是可行的
⑼ c语言程序填空:将html文件中的htm标记过滤掉
11 "w"
12 fgetc(fin)
13 sc
14 fgetc(fin) == '\n'
15 fclose(fin)
⑽ H3C-F100C防火墙网页过滤功能
还要开启aspf,并应用于出接口,具体操作如下:
防火墙管理----aspf----创建一个aspf策略1,勾选http,如下图,应用:
再访问禁了的网站就打不开了。