Программа для чтения кода и подсчета количества строк в нем, без учета комментариев и пустых строк - PullRequest
1 голос
/ 05 октября 2010

Я пытаюсь создать программу, которая с учетом входного файла возвращает количество всех строк кода во входном файле, за исключением пустых строк и строк комментариев. Я написал следующий код, однако мне нужна помощь с тем, как исключить строки, содержащие комментарии и пустые строки.

#include<stdio.h>
int main()
{
    int count;
    char ch;
    FILE *fptr;
    clrscr();
    fp=fopen("test.cpp","r");
    if(fp==EOF)
        {
        perror("Error:");
        }
    else
    {
        while(ch!=EOF)
        {
            ch=fgetc(fptr);
            if(ch=='\n')
                count++;
            if(ch=='\\')
                count--;
            if(ch=='\*')
                          {
                while(ch!='*\')
                                    {
                    ch=fgetc(fptr);
                                    }
            }
        }
    printf("the lines in the code are %d\n",count);
    fclose (fptr)
    }
    getchar();
    return 0;
}

Как я могу изменить вышеуказанный код, чтобы пустые строки и строки комментариев не учитывались?

Ответы [ 5 ]

3 голосов
/ 08 октября 2010

Если вы читаете входной файл символ за символом, у вас будет намного больше работы, чем если вы прочитаете его построчно. Ведь ты считаешь строки ...

psudocode

    1. initialize line count to 0
    2. read a line
    3. end of file? yes: goto 7
    4. is it a good line? yes: goto 5; no: goto 2
    5. increment line count
    6. repeat from 2
    7. output line count

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

Следующая версия игнорирует строки с // комментариями в пустой строке.

Версия 3 может игнорировать строки, содержащие /* и */

и версия 4 будет иметь дело с многострочными комментариями.

Прежде всего, получайте удовольствие!

2 голосов
/ 05 октября 2010

C комментариев: // и /* */.В следующих строках ваша проблема:

        if(ch=='\\')
            count--;
        if(ch=='\*')
            while(ch!='*\')
                ch=fgetc(fptr);

Другая проблема заключается в том, что вы не можете сопоставить двухсимвольный разделитель комментариев, читая символ за раз без какого-либо автомата.*

Кроме того, ваш код должен учитывать тот случай, когда комментарии встраиваются в реальные строки кода.например.

x = 1;    // Set value of x

Было бы гораздо лучше прочесть файл по очереди и проверить, является ли каждая строка пустой или комментарием, и увеличить счетчик, если нет.

1 голос
/ 08 октября 2010

Помимо ваших проблем с символьными константами у вас есть ошибки в том, как вы справляетесь с fputc.fputc возвращает int.Он может возвращать либо EOF, который является отрицательной целочисленной константой, если для красного цвета не было оставшихся символов, либо произошла ошибка, либо он может вернуть значение символа, считанного как unsigned char и преобразованного в int.

Если вы преобразуете возвращаемое значение fputc в char перед сравнением его с EOF, то допустимый символ может сравниться с равным EOF, что приведет к преждевременному завершению цикла.

Кроме того, цикл while не начинается до первого вызова fputc, поэтому вы используете неинициализированное значение ch в первой итерации.Это может привести к чему-либо.

Идиоматический способ формирования цикла будет выглядеть так:

int ch;
while ((ch = fgetc()) != EOF)
{
    /* ... */
}

В стороне от цикла вы должны быть осторожны при сравнении возвращаемого значения из-затот факт, что ch - это unsigned char, преобразованный в int.

На большинстве платформ проще всего было бы создать переменную char для целей сравнения, хотя вы можете поместить своего персонажаконстанты через ту же самую процедуру преобразования unsigned char в int.

Например

char c = ch;

if (c == '\n')

или

if (ch == (unsigned char)'\n')

Другие указали на проблемы с литералами вашего персонажа.

1 голос
/ 05 октября 2010

вы имеете в виду //, / * и * / вместо \ * и * \

, \ используется как escape-символ, который меняет «значение» символа после него.

\ n дает вам новую строку.с \\ вы получаете одиночный символ \, а с \ 'вы получаете что-то, что не закрывает открытие'

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

Представьте себе строку, подобную этой:

doSomething(); // foo
0 голосов
/ 05 октября 2010

Ну, отчасти проблема в том, что ваша переменная ch имеет длину только символ, но когда вы проверяете комментарии, такие как \\ и \*, они имеют длину в два символа и, следовательно, должны использовать строкусравнение.

Другая проблема состоит в том, что однострочные комментарии в C / C ++ фактически начинаются с //, а многострочные комментарии начинаются с /* и заканчиваются */.

...