删除C源文件中的所有注释
C程序设计语言第一章的第23题。题目:
删除C语言程序中所有的注释语句。
但是怎么判断//和/*是不是字符串中的一部分?
悲剧……依旧不完善。
程序代码:/*无法检测//以及/*是不是字符串的一部分。*/
#include <stdio.h>
#include <stdlib.h>
#define STAR '*'
#define SLASH '/'
#define ENTER '\n'
#define QUOTE '\"'
#define MAXLINE 1000
int getline(char s[], int size, FILE * fp);
void del_annotation(char s[]);
int main(void)
{
char line[MAXLINE];
int i;
FILE *p_file_r, *p_file_w;
if((p_file_r = fopen("words.txt","r")) == NULL)//测试文件
{
fprintf(stderr,"无法打开读取文件");
exit(EXIT_FAILURE);
}
if((p_file_w = fopen("word1.txt","w")) == NULL)//测试文件
{
fprintf(stderr,"无法打开写入文件");
exit(EXIT_FAILURE);
}
while((i = getline(line,MAXLINE,p_file_r)) > 0)
{
del_annotation(line);
fprintf(p_file_w,"%s",line);//将跳过所有注释的字符串写入新的文本。
}
fclose(p_file_r);
fclose(p_file_w);
printf("Bye!\n");
return 0;
}
int getline(char s[], int size,FILE * fp)//
{
int i,c;
for(i = 0; i < size; i++)
s[i] ='\0';
for(i = 0; i < size - 1 && (c = fgetc(fp)) != EOF && c != ENTER; i++)
s[i] = c;
if(c == ENTER)
s[i++] = c;
s[i] = '\0';
return i;
}
void del_annotation(char s[])//删除C源文件中的注释;
{
int i,j;
for(i = 0, j = 0;s[i] != '\0';i++)
{
if(s[i] == QUOTE)//将双引号到下一个双引号或回车间的字符存入数组。PS,假设该C源程序不存在语法错误。
{
s[j++] = s[i++];
while(s[i] != QUOTE)
s[j++] = s[i++];
s[j++] = s[i];
}
else if(s[i] == SLASH && s[i+1] == STAR)//跳过斜杠+星号到星号+斜杠之间的字符。
{
i += 2;//跳过斜杠+星号
while(s[i] != STAR && s[i + 1] != SLASH)
i++;
i += 2;//跳过星号+斜杠
}
else if(s[i] == SLASH && s[i+1] == SLASH ) //跳过双斜杠至回车之间的字符。
{
i += 2;
while(s[i] != ENTER)
i++;
}
else if(s[i] != ENTER)
s[j++] = s[i];
}
if(s[i-1] == ENTER)//s[i]为'\0',检查s[i-1]是不是回车,如果是则加上
s[j++] = ENTER;
s[j] = '\0';
}[此贴子已经被作者于2017-2-8 14:47编辑过]









