去除cpp中注释的小程序
//本程序針對 vc++ 6.0 編譯器語法,使用者要保證測試用例能在 vc++ 6.0 下編譯通過
#include"stdio.h"
#define checkInputError(ch)? if(scanf("%c",&ch) == EOF) { printf("Error!/n");return; }
#define ERROR? printf("Error!/n");return;
static int DQM = false;// 雙引號 double quotation marks
static __int64 ALL = 0;
void main() {
?char ch,ch1;
?freopen("in.txt","r",stdin);
?freopen("out.txt","w",stdout);
?while(scanf("%c",&ch) != EOF) {
??//如果讀到正斜桿
??if(ch == '/') {
???checkInputError(ch);
???if(ch == '/') {
????bool flag? = false;
????while(true) {
?????if(scanf("%c",&ch1) == EOF) { printf("/n//正常到文件尾"); return; }
?????if(ch1 == '/n' && ch != '//') {
??????printf("/n"); break;
?????}
?????ch = ch1;
????}
???}
???else if(ch == '*') {
????checkInputError(ch1);
????while(true) {
?????checkInputError(ch);
?????if(ch1 == '*' && ch == '/') break;
?????ch1 = ch;
????}
???}
???else {
????printf("/%c",ch); ALL += 2;
???}
??}
??//如果讀到單引號,? 這里還沒有處理空字符 ''
??else if(ch == '/'') {
???checkInputError(ch1);
???printf("'%c",ch1); ALL+= 2;
???if(ch1 == '/'') { printf("/*識別出空字符*/"); continue; }
???do {
????checkInputError(ch); printf("%c",ch); ALL++;
????if(ch1 == '//' && ch == '//') {??//取消識別第二個 / 為轉(zhuǎn)義
?????checkInputError(ch); printf("%c",ch); ALL++;
????}
????//else if(ch1 == '//' && ch == '/"') {?? /*識別? /"? */ /
?????checkInputError(ch); printf("%c",ch); ALL++; /
????}
????else if(ch1 == '//' && ch == '/'') {??//識別 /'
?????checkInputError(ch); printf("%c",ch); ALL++;
????}
????ch1 = ch;
???} while(ch != '/'');
??}
??//如果讀到雙引號
??else if(ch == '/"') {
???checkInputError(ch1);
???printf("/"%c",ch1); ALL+= 2;
???if(ch1 == '/"') { printf("/*識別出了空串*/"); continue; }//識別出了空串
???do {
????checkInputError(ch); printf("%c",ch); ALL++;
????if(ch1 == '//' && ch == '/"') {?? //識別? /"
?????checkInputError(ch); printf("%c",ch); ALL++;
????}
????else
????if(ch1 == '//' && ch == '//') {??//取消識別第二個 / 為轉(zhuǎn)義
?????checkInputError(ch); printf("%c",ch); ALL++;
????}
????ch1 = ch;
???} while(ch != '/"');
??}
??//正常輸出字符
??else {
???printf("%c",ch); ALL++;
??}
?}
?printf("/n //ALL = %I64d/n",ALL);
}
/*
//按 / / ' * 四個符號的相互嵌套作用分析,分成四種情況,/
采用一次掃描配對處理。
//每次讀字符都要判斷是否到 EOF
while(fin >> ch) {
?if 讀到 / :
??fin >> ch.
??if 是 / :
???while(true) {
??? ?if fin >> ch == EOF : 正常到達(dá)文件尾,return
????if 遇到回車: { 輸出回車,break; }
???}
??else if 是 * :
???判斷后面連續(xù)輸入的兩個字符為 *和/ 后,break
???????? else :
???輸出? / 和 ch
? ?else if 讀到 ' :
??fin >> ch1
??輸出 ' 和 ch1
??if ch1 是 ' : 識別了空字符,continue
??do:
???繼續(xù)輸入后續(xù)字符
??? //識別兩個連續(xù)字符為 /"? ,則輸出 /" ,往后跳過兩格
???識別兩個連續(xù)字符為 //? ,則輸出 // ,往后跳過兩格 //避免 / 被重用
???識別兩個連續(xù)字符為 /'? ,則輸出 /' ,往后跳過兩格 //避免 ' 被誤判為第一個 ' 的配對符
???不是以上情況,則判斷位置后移一格字符
??while 輸入字符 != '
???
??? ?else if 讀到 " :
??fin >> ch1
??輸出 " 和 ch1
??如果ch1 是雙引號:? contiune?? //識別為空串
??do:
???繼續(xù)輸入后續(xù)字符
???識別兩個連續(xù)字符為 /"? ,則輸出 /" ,往后跳過兩格
???識別兩個連續(xù)字符為 //? ,則輸出 // ,往后跳過兩格
???不是以上情況,則判斷位置后移一格字符
??while 輸入字符 != "
?else :? 按正常情況輸出 ch??
}
*/
/*//測試用例:
? //abc/
abc,/
不接著 /
?abc,接著/
printf("不可思議/n");///
強(qiáng)/
printf("不可思議/n");/
?printf("不可思議/n");
//上面這整個用例可能被病毒利用
?//printf(""//n");
?printf("%c/n",'"');
?//printf("%c/n",''');
?//printf("%c/n",'');
?printf("'/n");
?printf("''/n");
?printf("///n");
?printf("%c/n",'/');
?printf("%c/n",'/'');
?printf("/' /n");
?printf("/"");
?printf("");
?printf("//");
?printf("///b///"");
?printf("%c",'1/3');
?printf("%c",'1/1/'');
?printf("%c",'1///'');
?printf("%c",'1///'/'');
?printf("%c",'/"/1');
?printf("%c",'/123');
?printf("%c",'/x43');
?printf("%c",'/好');
?printf("%c",'/"/3/"');
?printf("%c",'/'/3/'');
?printf("/中");
?// /*printf("*//*");
*/
//? /*/
//2009-03-25
總結(jié)
以上是生活随笔為你收集整理的去除cpp中注释的小程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大整数乘法---FFT算法
- 下一篇: MPICH 完整配置存档