删除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编辑过]