Подсчет строк Переполнение стека

Я работаю с этим миром, который считает логические строки в программе, пропуская комментарии и черные линии. Счетная линия работает, но я не знаю, как пропустить строки комментариев, я пытаюсь

if (line == "//")
{
comment++;
}

но он проверяет только строки, начинающиеся с "//" и если рядом есть текст, это не считается строкой комментария: /

В конце, когда я знаю общее количество строк и общее количество строк комментариев, я вычту totalLines-commentLines знать реальные номера программных строк.

Может кто-то помочь мне с этим?

Спасибо

#include <iostream>
#include <fstream>
#include <istream>
using namespace std;

int main()
{
int numlines = 0;
int comment = 0;
string line;

ifstream myfile("wr.cpp");
while (myfile.good())
{
getline(myfile, line);
if (line == "//")
{
comment++;
}
if (line == "/**/")
{
comment++;
}
++numlines;
}
cout << "Number of lines: " << numlines << endl;
cout << "Number of comment lines: " << comment << endl;
return 0;
}

0

Решение

Я думаю, что ваша методология … ошибочна.

Рассмотрим строку вроде:

int x = 1;    // starting from 1 because [some reason]

Поскольку ваш код стоит прямо сейчас, он считается только строкой без комментариев. Как вы уже описали, что бы вы хотели сделать, это будет считаться только строкой комментариев.

На самом деле, tThis содержит и код, и комментарий, поэтому вы обычно хотите считать его как код а также комментарий, а не только один или другой.

Делать эту работу хорошо, безусловно, нетривиально. Очевидные проблемы, с которыми вы сталкиваетесь:

  1. строка, которая содержит что-то похожее на комментарий
  2. продолжение строки
  3. триграфы
    • Может скрывать продолжение строки
    • Можно создать разделитель ложных комментариев
  4. Многострочные комментарии C-ctyle
  5. #ifs, #ifdefс и т. д.

Вероятно, есть больше проблем, чем это (хотя это только то, что пришло мне в голову сразу), но их должно быть достаточно, чтобы дать хотя бы общую картину.

Итог: я думаю, чтобы продвинуться далеко вперед в этом (вообще) том, что вы делаете, чтобы по крайней мере нуждаться в достаточно полной / точной C ++ лексер. Вам, вероятно, не нужен полный анализатор, но я думаю, что любая попытка, которая не использует полный лексер C ++, почти наверняка потерпит неудачу, вероятно, довольно плохо и довольно часто.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]