補充前一篇中統計C語言程序行數的程序
寫得比較匆忙,可能有些失誤,等弄明白GitHub的用法並完善程序后再補充完整代碼鏈接
沒有寫成函數,但經過簡單修改可以作為一個計算或判斷函數使用
判斷算法主要為以下幾點
- 如果是' '、'\r'、'\t'則直接跳過;
- 如果是'\n'則判斷該行是否有字符,沒有跳過;
- 對於'//'類的注釋,判斷注釋符號前是否有效,無效則跳過;
- 對於'/ * '類的注釋,則尋找下一個' * /',如果中間遇到'\n',則判斷該行是否有效,例如有效代碼與'/ * '在同一行時,該行應該計算在內。
對於文件讀寫,暫時沒有實現文件夾遍歷,文件讀寫及所需頭文件代碼如下
#include<iostream>
#include<fstream>
#include<streambuf>
using namespace std;
ifstream a("file.txt");
string s((istreambuf_iterator<char>(a)),istreambuf_iterator<char>());
下面是判斷程序主要代碼
int main()
{
int i,j,k,n,m,x,y;
i=0;
j=0; //判斷該行是否有效
k=0; //判斷'/*'類的注釋中是否有換行
n=0;
m=s.length();
while (i<m)
{
if ((s[i]==' ')||(s[i]=='\r')||(s[i]=='\t'))
{
i++;
continue;
} //第一類
if (s[i]=='\n')
{
if (j==1)
{
n++;
j=0;
}
i++;
continue;
} //第二類
if ((s[i]=='/')&&(s[i+1]=='/')&&(i<m-1))
{
if (j==1)
{
n++;
j=0;
}
i++;
while ((i<m)&&(s[i]!='\n')) i++;
i++;
continue;
} // '//'類注釋
if ((s[i]=='/')&&(i<m-1))
{
if (s[i+1]=='*')
{
i+=2;
while (i<m)
{
if (s[i]=='\n')
{
if (k==0)
{
if (j==1)
{
n++;
j==0;
}
k==1;
}
}
if ((s[i]=='*')&&(i<m-1))
{
if (s[i+1]=='/')
{
i++;
break;
}
}
i++;
}
k==0;
i++;
continue;
}
} // '/*'類注釋
j=1;
i++;
}
if (j==1) n++; //最后一行有時沒有'\n'