Помощ зо прогама на С-дава ми грешка

Яко PHUN ;-)
Място за разтоварване на умствения багаж на потребителят! Вицове-мицове, клипове, закачалки за откачалки и тем подобни яко къртещи фаянса на комшията нещица.
Публикувай отговор
Аватар
AGGRESSOR
Потребител
Потребител
Мнения: 228
Регистриран на: Съб Фев 12, 2005 16:53 pm
skype: drago_t
Местоположение: STZ
Обратна връзка:

Помощ зо прогама на С-дава ми грешка

Мнение от AGGRESSOR »

това ми е условието на програмата : Да се напише програма, която брои различните думи в зададен входен файл. Резултатът да се запише в изходен файл във вида <дума, честота на срещане

Код за потвърждение: Избери целия код

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#include<conio.h>
#define SIZE 500

FILE *fin=NULL,*fout=NULL;
char **d;
int index=0;

void writewrd(void);
void readwrd(void);
int issep(char a);

int issep(char a)     //dali e razdelitel na dumi
{  char sep[19]={'^','+','_','[',']',')','(',',',' ','.','?','!',':',';','/','\n',EOF};
   int i;
   for (i=0;i<19;i++) if(a==sep[i]) return 1;
   return 0;
}


void readwrd()   //4ete dumite ot fail i gi zapisva v dinami4en masiv
{ char c;
  int j,i=0,n=1;
  char tempwrd[81]; //masiv v koito se zapisva dumata simvol po simvol

  while(!feof(fin))
  {
	c=fgetc(fin); //4etem simvol po simvol
	if(!issep(c))  { tempwrd[i]=c; i++; continue;} //ako ne e razdelitel sloji znaka v dumata
	if(issep(c))    //ako e razdelitel zna4i dumata e zavurshena
	{ if(i==0) continue; //zashtitavame se ako ima 2 razdelitela 1 sled drug
	  tempwrd[i]=0;    //zavurshvashtata 0 na dumata
	  d[index]=(char *) calloc(strlen(tempwrd)+1,sizeof(char)); // zadelqme pamet za duma s duljina duljinata na tempwrd
	  strcpy(d[index],tempwrd); //kopirame dumata v dinami4niq masiv
	  *tempwrd=0; //izprazvame tempwrd
	  index++;
	  i=0;
	}
	if((index%SIZE)==(SIZE-1))  //ako sme stignali do kraq na dinami4niq masiv i trqbva da zadelim oste pamet
	{  n++;
	   if((d=(char**) realloc(d,sizeof(char*)*SIZE*n))==NULL) {printf("/n not enough memory"); exit(1); }  //zadelqme mesta za dumi
	   else  {
		   for(j=(index+1);j<(SIZE+index);j++) d[j]=NULL;  //triem vsi4ko koeto ima na toku sto zadelenite mesta
		 }
	}
  }

  writewrd();
  fclose(fin);
  fclose(fout);
}

void writewrd()        //pishe dumite ot masiva vuv fail
{
   int i,j,br=1,gr=0;
   for(i=0;i<index;i++)  //obhojdame dumite
   {
     if(strlen(d[i])==0) continue;  //ako dumata e iztrita preminavame na sledvashtata
     for(j=i+1;j<index;j++)  //tursim povtarqshta se duma s tozi cikul
	  if (strcmp(d[i],d[j])==0) {d[j]=NULL; br++;} //ako se povtarq duma, uveli4avame broq4a i iztrivame povtarqshtata se
     fprintf(fout,"\n %d) '%s' -> %d",gr+1,d[i],br);
     br=1;       //kolko puti se sreshta dumata
     gr++;      //poredniq nomer na dumata
   }

}

void main ()
{
  char fname1[10],fname2[10];
  printf("Vyvedete ime na faila ot koito ste se 4ete : ");
  scanf("%s",&fname1);
  printf("\n Ime na faila v koito ste se zapisva rezultata : ");
  scanf("%s",&fname2);
  fin=fopen(fname1,"rt");
  fout=fopen(fname2,"wt");
  if(fin==NULL || fout==NULL)
  {
     printf("\n Error opening file");
     getch();
     exit(1);
  }
  d=(char **) calloc(SIZE,sizeof(char*));
  readwrd();
  printf("\nSuccess");
}
проблема е в това че като я тествам не ми тръгва. като напиша името на фаил които да отворя и името фаила които да се записва резултата програмата ми дава Don't Send.
програма трябва да тръгне на Microsoft Visual C++ 6.0 за6тото това учим :)
моля помогнете
Аватар
AGGRESSOR
Потребител
Потребител
Мнения: 228
Регистриран на: Съб Фев 12, 2005 16:53 pm
skype: drago_t
Местоположение: STZ
Обратна връзка:

Мнение от AGGRESSOR »

програмата работи като сложа само 1 дума в файла който отварям, сложа ли повече 2,3.. думи ми дава Don't send. ако и задам грешно име на файла който да отвори ми изписва че неможе даго отвори което трябва да е така.ако има значение програма тръгва без проблем на борланд .един приятел който ми помогна да я напишем ми каза че може би проблема е в calloc ,но и той незнае точно как да го оправи :(
Аватар
kitikri
Старо куче медалист
Старо куче медалист
Мнения: 552
Регистриран на: Пет Апр 23, 2004 14:50 pm
Местоположение: /dev/null
Обратна връзка:

Мнение от kitikri »

Щом ти дава dont send значи пишеш или четеш в част от паметта където не трябва (разбирай която не е на програмата). Ще го погледна довечера щото в момента съм на комп без компилатор. Поиграй си с дебъгера, поне тоя на VS-то що-годе бива :)
Аватар
kitikri
Старо куче медалист
Старо куче медалист
Мнения: 552
Регистриран на: Пет Апр 23, 2004 14:50 pm
Местоположение: /dev/null
Обратна връзка:

Мнение от kitikri »

Дъни се при strcmp във writewrd. Да видим как да го оправим...
Аватар
kitikri
Старо куче медалист
Старо куче медалист
Мнения: 552
Регистриран на: Пет Апр 23, 2004 14:50 pm
Местоположение: /dev/null
Обратна връзка:

Мнение от kitikri »

Код за потвърждение: Избери целия код

void writewrd()        //pishe dumite ot masiva vuv fail
{
   int i,j,br=1,gr=0;
   for(i=0;i<index;i++)  //obhojdame dumite
   {
     if(strlen(d[i])==0) continue;  //ako dumata e iztrita preminavame na sledvashtata
     for(j=i+1;j<index;j++) //tursim povtarqshta se duma s tozi cikul
     {
         if (strcmp(d[i],d[j])==0) {d[j]=NULL; br++;} //ako se povtarq duma, uveli4avame broq4a i iztrivame povtarqshtata se
     }
     fprintf(fout,"\n %d) '%s' -> %d",gr+1,d[i],br);
     br=1;       //kolko puti se sreshta dumata
     gr++;      //poredniq nomer na dumata
   }

}
Грешката е че изтриваш повтарящата се дума с NULL вместо със специалния нулев знак. Ето ти работеща версия:

Код за потвърждение: Избери целия код

void writewrd()        //pishe dumite ot masiva vuv fail
{
   int i,j,br=1,gr=0;
   for(i=0;i<index;i++)  //obhojdame dumite
   {
     if(strlen(d[i])==0) continue;  //ako dumata e iztrita preminavame na sledvashtata
     for(j=i+1;j<index;j++) //tursim povtarqshta se duma s tozi cikul
     {
         if (strcmp(d[i],d[j])==0) {d[j]="\0"; br++;} //ako se povtarq duma, uveli4avame broq4a i iztrivame povtarqshtata se
     }
     fprintf(fout,"\n %d) '%s' -> %d",gr+1,d[i],br);
     br=1;       //kolko puti se sreshta dumata
     gr++;      //poredniq nomer na dumata
   }

}
Аватар
AGGRESSOR
Потребител
Потребител
Мнения: 228
Регистриран на: Съб Фев 12, 2005 16:53 pm
skype: drago_t
Местоположение: STZ
Обратна връзка:

Мнение от AGGRESSOR »

10х
Публикувай отговор