Newsgroup: it.comp.lang.c
Titolo: non so cosa non va? aiuto

Ho fatto il seguente programma che mi fa immettere un testo in un vettore di
caratteri e una parola da cercare nel testo. e poi se la trova indica la
frequenza con cui l' ha trovata . In più visualizza l'elenco delle parole
presenti nel vettore in ordine e con accanto la loro rispettiva frequenza .
Il programma sembra funzionare ma ogni tanto mi da degli errori , cioè mi
visualizza accanto alle parole nell'elenco dei strani simboli prima della
frequenza e non so perchè, l'errore sembra imputabile alla funzione "stampa"
che mi ha procurato non pochi problemi. Qualcuno puo aiutarmi o suggerirmi
delle alternative migliori alle mie scelte???
Vi ringrazio in anticipo ecco il programma:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#define MAX 101
void inserisci(char *sp);
void trova(char *testo, char *chiave);
void stampa(char *testo);
char r[MAX];
void main()
{
 char p[MAX];
 clrscr();
 inserisci(r);
 if(r[0]!='\0')
  {
   gotoxy(2,4);
   printf("Testo da cercare: ");
   gets(p);
   trova(r,p);
   stampa(r);
  }
 else
  {
   gotoxy(1,6);
   printf("Stringa vuota");
  }
 getch();
}
void inserisci(char *sp)
{
 int i=0;
 gotoxy(2,1);
 printf("Inserire un testo MAX %d caratteri premere # per finire",MAX-1);
 gotoxy(2,2);
 do {
  sp[i]=getche();
  i++;
 } while ((i<MAX)&&(sp[i-1]!='#'));
 sp[i-1]='\0';
}
void trova(char *testo, char *chiave)
{
 int f=0, i, c, j, trovato=0;
 char aux[MAX];
 i=0;
 while (i<strlen(testo))
  {
   if(chiave[0]==testo[i])
    {
     j=i;
     for(c=0;c<strlen(chiave);c++)
      {
       aux[c]=testo[j];
       j++;
      }
     aux[c]='\0';
     if(strcmp(chiave,aux)==0)
      {
       trovato=1;
       f++;
       i=j-1;
      }
      else trovato=0;
    }
    i++;
  }
 gotoxy(2,6);
 if(f) printf("Trovata la parola \'%s\' con frequenza %d",chiave,f);
  else printf("Parola \'%s\' non trovata",chiave);
}
void stampa(char *testo)
{
 char mat[MAX][MAX], aux[MAX];
 int i,j,c,c1,c2,f=1;
  c=j=i=0;
  while (c<strlen(testo))
   {
    mat[i][j]=testo[c];
    if ((testo[c]==' ') || (testo[c]=='\0'))
     {
      mat[i][j]='\0';
      j=0;
      i++;
     }
     else j++;
     c++;
   }
  for(c1=0;c1<i;c1++) /* Ordina le parole */
   for(c2=c1+1;c2<=i;c2++)
    if(strcmp(mat[c1],mat[c2])>0)
     {
      strcpy(aux,mat[c1]);
      strcpy(mat[c1],mat[c2]);
      strcpy(mat[c2],aux);
     }
  gotoxy(1,8);
  for(c1=0;c1<=i;c1++)
   {
    while((strcmp(mat[c1],mat[c1+1])==0)&&(i>0))
     {
      c1++;
      f++;
     }
    printf("%s\t%d\n",mat[c1],f);
    f=1;
   }
}

 ha scritto nel messaggio
news:9bsjvs$t3s$1...@serv1.albacom.net...




Semplice:

in stampa tu crei la matrice di stringhe, controllando gli spazi o il
terminatore in quanto l'ultima parola sarà seguita da terminatore,
ed infatti tu scrivi:

if ((testo[c]==' ') || (testo[c]=='\0'))


peccato che tu esegui il ciclo con

while (i<strlen(testo))


che non arriva al terminatore, in quanto strlen torna la lunghezza della
stringa senza terminatore, ciò vuol dire che per l'ultima parola
tu non eseguirai

mat[i][j]='\0';


ed ovviamente la printf scriverà la stringa fino al primo terminatore
trovato, probabilmente sforando dalla zona di memoria allocata.

BYEZZZZZZZZZZZZZZZZZZZZZZ

Stefano ha scritto:



 Ho fatto il seguente programma che mi fa immettere un testo in un vettore di
