Newsgroup: it.comp.lang.c
Titolo: URGENTE esercizio d'esame #2

Anche questo esercizio lo devo portare entro giovedi,mi aiutate a
risolverlo?
Sotto c'e' la mia probabile soluzione ma non funziona (non so perche?).
Ecco il testo dell'esercizio:
Scrivere una funzione C,che ricevendo in ingresso il nome di un file
contenente singoli caratteri separati da spazi
bianchi e/o ritorni  capo,ed un intero n,restituisca una stringa contenente
la concatenazione dei primi n caratteri
presenti nel file. Qualora il file contenga meno di n caratteri la funzione
C deve restituire una stringa contenente
il primo carattere ripetuto n volte.Assumere che il file contenga almeno un
carattere.
MIA SOLUZIONE (non funziona...)
#include <stdio.h>
char *concatena(char *file,int n)
{ FILE *fp;
  char ch,*ris,primo;
  int i,j,caratteri=0;
  fp=fopen(file,"r");
  ris=(char *)malloc(n);
 for (i=0;i<=n;i++)
     while ((ch=fgetc(fp)) != EOF)
         if ( (ch != ' ') || (ch != '\n') )
            {ris[i]=ch;
             caratteri++;
            }
  if ( caratteri < n)
    { primo=ris[0];
      for (j=0;j<=n;j++)  ris[j]=primo;
    }
  fclose(fp);
  return ris;
}
GRAZIE A TUTTI!


Faccio prima a riscriverla...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *concatena(char *file,int n)
{
 FILE *fp;
 char ch, *ris;
 int i;
 fp = fopen(file, "r");
 ris = malloc(sizeof(char) * (n + 1));
 i = 0;
 while((ch = getc(fp)) != EOF && i < n)
 {
  if(ch != ' ' && ch != '\n')
   ris[i++] = ch;
 }
 if(i < n)
 {
  ris[n - 1] = '\0';
  ris = strset(ris, *ris);
 }
 else
  ris[i] = '\0';
 fclose(fp);
 return ris;
}

come al solito ti ringrazio tantissimo x la tua disponibilita ma purtroppo
neanche la tua soluzione gira.tu l'hai provata?
--
www.sitissimo.3000.it

 ha scritto nel messaggio
news:BUHW6.5259$Cq5.2...@news.infostrada.it...

Si da me girava
Fammi vedere tutto il programma con il main...

  ris = strset(ris, *ris);
strset non e' una funzione standard. Qui si poteva usare
   memset(ris,*ris,n);
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

}
Anche qui manca il terminatore di stringa.


 un po' di confusione su questo punto.
Ma non è meglio fare sempre così, per rendere il codice più portabile?
oppure sizeof(char) è sempre uno in qualsiasi sistema? forse no ho capito
qualcosa sul tipo char, perchè se si trattava ad esempio di un "int" sarebbe
stato meglio usare l'operatore sizeof , o sbaglio?

stato meglio usare l'operatore sizeof , o sbaglio?
In quel caso assolutamente si. Il discorso e' che sizeof
indica quanti char e' grosso un tipo dati.
Quello che cambia da sistema a sistema e' il numero di
bit in un char (sono minimo 8 ma possono essere di piu');
sizeof(char) pero' e' sempre 1 perche' indica quanti char
richiede un char.


e quindi come lo devo correggere?lo devo portare al prof entro giovedi...
aiutatemi ho provato a fare qualche modifica ma ottengo solo la stampa di
"n" faccine :)
--
www.sitissimo.3000.it

Questo esercizio lo devo portare entro giovedi,mi aiutate a
risolverlo?
Ecco il testo :
Scrivere una funzione C,che ricevendo in ingresso il nome di un file
contenente singoli caratteri separati da spazi
bianchi e/o ritorni  capo,ed un intero n,restituisca una stringa contenente
la concatenazione dei primi n caratteri
presenti nel file. Qualora il file contenga meno di n caratteri la funzione
C deve restituire una stringa contenente
il primo carattere ripetuto n volte.Assumere che il file contenga almeno un
carattere.
PLEASE!!!!non ci riesco!!
--
www.sitissimo.3000.it

come non detto,alla fine ci sono riuscito da solo!!
eccolo se vi interessa....
#include <stdio.h>
char *concatena(char *file,int n)
{
 FILE *fp;
 char ch,primo, *ris;
 int i=0,j,caratteri=0;
 fp = fopen(file, "r");
 ris =(char *) malloc(n+1);
 while (( (ch=fgetc(fp)) != EOF )  && (i < n))
    if (( ch != ' ') && (ch != '\n'))
      {ris[i++]=ch;
       caratteri++;
      }
 ris[i]='\0';
 if ( caratteri<n )
   { primo=ris[0];
     for (j=0;j<n;j++) ris[j]=primo;
   }
 fclose(fp);
 return ris;
}
Ciao a tutti!!!!!
--
www.sitissimo.3000.it