Newsgroup: it.comp.lang.c
Titolo: Perche'?

Perche' mi restituisce sempre il messaggio: (Il pattern  '......' e'
stato trovato
alla posizione  '101')  anche esso e' inesistente?
Ringrazio chi me lo puo' spiegare.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
#define N 10
void Elimina_return() /* Questa funzione elimina il problema */
{                       /* di acquisire oltre il carattere     */
 int c;              /* ('y' o 'n')il carattere di newline. */
 do
 {
  c=getchar();
 }
 while(c!='\n');
}
int main(int argc, char *argv[])
{
        char *p, pattern[N], testo[MAX];
        int n,c, i = 0;
  FILE *fp;
  if (argc != 2)
  {
   printf("Ti sei dimenticato di specificare il nome del file.\n");
   exit (1);
  }
  if ((fp=fopen( argv[1],"r"))==NULL)
  {
   printf("Non e' possibile aprire il file %s\n", argv[1]);
   exit(2);
  }
       do
       {
            c = getc(fp);
   testo[i++] = c;
       }    while(c!=EOF);
        printf("\nDigitare il pattern da cercare(massimo %d caratteri):
\n",N);
        printf("\n");
        fgets(pattern, sizeof pattern, stdin);
  n = 0;
  if (p = strchr(pattern, '\n')) /* Restituisce un puntatore  */
                              /* (p) alla fine del pattern */
                *p = '\0';
label1:
  if (p = strstr(testo + n, pattern)) /*Restituisce un */
  /* puntatore alla prima occorenza del pattern nel file */
  {
                printf("Il pattern '%s' e' stato trovato alla posizione
%d.\n",
                       pattern, p - testo + 1);
    n = (char) (p - testo + 1);
  }
  else
  {
                puts("Pattern inesistente");
                exit(3);
  }
  puts ("\nVuoi continuare la ricerca? (y/n)\n");
label2:
  c = getchar();
  Elimina_return();
  printf("\n");
  if (c == 'y')
   goto label1;
  else if (c == 'n')
   exit (0);
  else
   puts("\nErrore!: digita 'y' o 'n'.\n");
        goto label2;
  fclose(fp);
  return 0;
}

     n = (char) (p - testo + 1);
Questo è un tipico esempio di cast dannoso. Il compilatore non ha potuto
avvisarti dell'errore che stavi facendo e cioè assegnare un long
convertito in char ad un int con possibile perdita di informazione.
Questo è il motivo principale per cui non ti funziona. Devi definire n
come long e scrivere
n = p - testo + 1;
senza cast. E poi te l'avevo già detto: evita tutte quelle label e goto
assolutamente inutili.
EMG

 wrote:
M>Perche' mi restituisce sempre il messaggio: (Il pattern  '......' e'
M>stato trovato alla posizione  '101')  anche esso e' inesistente?
                                 ^^^
[ snip ]
M>#define MAX 100
              ^^^
'testo' e' un array di 100 char. Per come e' calcolata, la
posizione 101 si riferisce a testo[100], che non esiste.
Te lo ho un po' riscritto ;)
-------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
#define N 10
int continua(void)
{
        int answer, c;
        fputs("Vuoi continuare ? (y/n) ", stdout);
        fflush(stdout);
        answer = c = getchar();
        while (c != '\n' && c != EOF) c = getchar();
        return (answer == 'y');
}
int main(int argc, char *argv[])
{
        char *p, *cur, pattern[N], testo[MAX + 1];
        int c, i;
        FILE *fp;
        if (argc != 2) {
                puts("Manca il nome del file."); exit(1);
        }
        if ((fp = fopen(argv[1], "r")) == NULL) {
                perror("fopen"); exit(2);
        }
        i = 0;
        while (((c = getc(fp)) != EOF) && i < MAX) testo[i++] = c;
        testo[i] = '\0';
        do {
                printf("Pattern da cercare (max %d caratteri): ", N);
                fflush(stdout);
                fgets(pattern, sizeof pattern, stdin);
                if ((p = strchr(pattern, '\n'))) *p = '\0';
        } while (strlen(pattern) == 0);
        cur = testo;
        do {
                if ((p = strstr(cur, pattern))) {
                        printf("Il pattern '%s' e' stato trovato "
                               "alla posizione %d.\n\n",
                               pattern, p - testo + 1);
                        cur = p + 1;
                } else {
                        puts("Pattern non trovato."); break;
                }
        } while (continua());
        fclose(fp);
        return 0;
}
-------------------------------------------------------------------
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 assolutamente inutili.
Be' io ho detto che non ho esperienza sulla programmazione,
questo e' il mio primo lavoro scolastico in 'c';
sono sicuro del fatto che il 'goto' non deve essere 
utilizzato in questa situazione ma mi viene difficile
scrivere un codice diverso anche per ragioni di tempo.
Comunque ti ringrazio lo stesso per i consigli, ciao.

 Te lo ho un po' riscritto ;)
Grazie per l' aiuto, ciao.