Премини към съдържанието

Препоръчан отговор


Задачата е "Да се преброят коментарите в програмата". За .txt файлове кодът тръгва без проблем, но като се опитам да отворя .c файл ми изкарва само празна конзола и някакъв error. Идеи как да го поправя??

 

#include<stdio.h>
#include<stdlib.h>
 
int main ()
{
   FILE *fp;
   char c,d[1000000000];
   int n = 0,k=0;
   fp = fopen("1.c","r");
   if(fp == NULL) 
   {
      perror("Error in opening file");
      return(-1);
   }
   do
   {
   
      if( feof(fp) )
      {
          break ;
      }
      d[n]= fgetc(fp);
      n++;
   }while(1);
   
   for(int i=0; i<n; i++){
           printf("%c",d);
           if((d=='/' && d[i+1]=='/') ||(d=='/' && d[i+1]=='*'))
           {
                         k++;
                         }
                         }
   fclose(fp);
   printf("%dn",k);
   system("pause");
   return(0);
}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

An Access Violation (Segmentation Fault) raised in your program.

И защо ви е този огромен масив? С един брояч, една временна променлива за флаг и една (или две) за прочетения символ можете да обходите целия файл. Освен това ще получите резултата веднага след като сте прочел файла без нужда от целия този цикъл по масива :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това ми беше първоначалния замисъл, но не намерих функция, която да чете string от файл, а коментарите са съставени от два символа (тоест са string). Пробвах и да извикам два пъти fgetc(), но по някаква странна причина винаги ми връщаше 1.

Редактирано от zobie (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това ми беше първоначалния замисъл, но не намерих функция, която да чете string от файл, а коментарите са съставени от два символа (тоест са string).

while....

a=getchar()

....

b=a

и при следващия цикъл в а и б ще имате текущия и предишния символ

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

100000 символа са съвсем достатъчни, с d[100000] - работи програмата и без да я променяш ама трябва да и сложиш и някой друг коментар, че да не вади само 0

Редактирано от ined (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
Така??
while(feof(fp)!=1)
{
a=fgetc(fp);
if((b=='/' && a=='/') ||(b=='/' && a=='*'))
           {
                         k++;
                         }
b=a;
}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

Така??
while(feof(fp)!=1)
{
a=fgetc(fp);
if((b=='/' && a=='/') ||(b=='/' && a=='*'))
           {
                         k++;
                         }
b=a;
}

 

Да, нещо подобно, само че имам няколко забележки

1. преди while трябва да има нещо от рода на b="";

2. нямам спомени по стандарта, но какво ще стане ако вътре в коментар имате отново /* или //

това, което ви препоръчвам като идея е:

проверявате дали предишния и текущия символ са // и ако да увеличавате брояча на коментарите е един и правите бърз while цикъл докато срещнете символа за нов ред или края на файла

проверявате дали предишния и текущия символ са /* и ако да увеличавате брояча на коментарите е един и правите бърз while цикъл докато срещнете комбинация от символи */  или края на файла

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
char b='',c='';
while(feof(fp)!=1)
{
a=fgetc(fp); // за да може тук а = първия символ от новия ред
if((b=='/' && a=='/') ||(b=='/' && a=='*'))
           {
                         k++;
                         }
b=a;
c=fgetc(fp);
while(feof(fp)!=1 || (a!='' && c!='n') || (a!='*' && c!='/'))
{
a=fgetc(fp);
c=fgetc(fp);
}
fgetc(fp); //примерно ако срещне n a ще е = '' затова трябва да се извика още венъж
}
Редактирано от zobie (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Проверявайте комбинациите една по една. И ползвайте таг code на форума за да е по-четливо

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

примерно ако срещне n a ще е = '' затова трябва да се извика още венъж

ако срещне n fgetc() ще върне точно 'n'

плюс това коментар е всичко заключено м/у /* */ а не само до края на реда.

Редактирано от ined (преглед на промените)
  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.