Newsgroup: it.comp.lang.c
Titolo: Un suggerimento su questo "programma" ?

Buongiorno a tutti, ho buttato giù un pezzo di programma che deve
leggere un file di testo della forma:
buonagura  vincenzo   566/769
buonomo   davide     566/427
buonomo   valentina  566/213
cancellieri  carlo      566/113
capaldo   luigi      566/1131
capano    fabrizio   566/1334
capobianco  walter     408/299
caporale  maria raffa50/270
In pratica si devono riconoscere nome e cognome, classe e matricola e
memorizzarle in tre stringhe diverse (almeno per il momento)
(il numero di spazi è volutamente casuale)
Il programma sembra funzionare, ma ho la VAGA impressione che non sia
scritto per bene, anche perchè WXP mi segnala che l'applicazione verrà
chiusa a causa di un errore...
Abbiate pietà, sono ancora in fase di studio e questi esperimenti mi
fanno impazzire...grazie!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> //ho incluso questa sperando di usare isaplha e
isdigit, ma non funge...
#define MAXC 60
typedef char *stringa;
stringa leggi(FILE *fp)
{
 char *res;
 stringa d1;
    char riga[MAXC];
    res=fgets(riga, MAXC, fp);
    if( res==NULL )
        return NULL;
    d1 = (char *) malloc ((strlen(riga)+1)*sizeof(char));
    if (d1 == NULL)
    {
     printf ("ERRORE: memoria dinamica insufficiente per stringa\n");
        exit (1);
    }
  /* filtra eventuale carattere a-capo */
    if (riga[strlen(riga)-1] == '\n')
    {
  riga[strlen(riga)-1] = '\0';
    }
 strcpy (d1, riga);
 return d1;
}
int main(void)
{
 FILE *fd;
 stringa riga,nome,classe,matricola;
 char temp[20];
 int i,j;
 /* apre il file */
 fd=fopen("elewin.txt", "r");
 if( fd==NULL ) {
   perror("Errore in apertura del file");
   exit(1);
 }
 riga=leggi(fd);
 while (riga!= NULL)
 {
  i=0;
  //Lettura nome
  while ( ( riga[i] < '0')  || ( riga[i] > '9') )
  {
   i++;
  }
  nome = (char *) malloc (i*sizeof(char));
  if (nome == NULL)
  {
      printf ("ERRORE: memoria dinamica insufficiente per stringa\n");
   exit (1);
  }
  strcpy(nome,riga);
  nome[i]='\0';
  fprintf (stdout, "%s\n", nome);
  //Fine lettura nome
  //Lettura classe
  classe = (char *) malloc (5*sizeof(char));//5 è la lunghezza massima
che può raggiungere una classe
  if (classe == NULL)
  {
      printf ("ERRORE: memoria dinamica insufficiente per stringa\n");
   exit (1);
  }
  j=0;
  while (riga[i] != '/')
  {
   temp[j]=riga[i];//in realta speravo di usare strcat, ma non va...
   i++;
   j++;
  }
  strcpy(classe,temp);
  classe[j]='\0';
  fprintf (stdout, "%s\n", classe);
  //Fine lettura classe
  //Inizio lettura matricola
        //nulla ancora...
  riga=leggi(fd);
 }
 return 0;
}
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.561 / Virus Database: 353 - Release Date: 13/01/2004

   nome = (char *) malloc (i*sizeof(char));
Idem.  Inoltre sizeof(char) è sempre uguale a 1, su qualsiasi
piattaforma.
Quindi diventa:
nome = malloc(i);
Io semplificherei, comunque, la lettura delle stringhe.  Qualcosa come
(bada che non ho compilato):
#include <stdio.h>
#include <ctype.h>
int main()
{
    char s[128];
    int iriga;
    for (iriga = 1; fgets(s, sizeof s, stdin); iriga++) {
          int inome = 0, iclasse = 0, i;
          char nome[128] = {0};
          char classe[128] = {0};
          for (i = 0; s[i]; i++) {
              if (isalpha(s[i])) nome[inome++] = s[i]
              else
              if (isdigit(s[i]) || (s[i] == '/')) classe[iclasse++] =
s[i];
          }
          printf("Riga %d: nome = \"%s\" classe = \"%s\"\n", nome,
classe);
    }
    return 0;
}
Puoi eventualmente aggiungere dei controlli sui limiti raggiunti da
inome e iclasse.

           char classe[128] = {0};
Avevo letto che nuovi standard C permettevano la definizione di variabili
come hai fatto te, 
all'interno del loop e non solo all'inizio della funzione. Da quando e'
diventato possibile? C89?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 come hai fatto te, all'interno del loop e non solo all'inizio della
funzione.
Che io sappia, è sempre stato possibile.  In C89 si può fare,
comunque.

 comunque.
In C89 si puo' fare all'inizio di un blocco, in C99, come in C++, piu' o
meno ovunque.
Il codice scritto da Laforgia ovviamente funziona anche in C89 in quanto le
variabili vengono dichiarate all'inizio del blocco.
int main()
{
    int x = 5;
    // code....
    ++x;
    // code....
    {
          int y = 7;
          //  code.....
          ++y;
          //  code.....
          {
                int z = 9;
                // code......
                ++z;
                // code.......
          }
          // code.......
    }
    // code.......
    return 0;
}
questo codice compila sia in C89 che C99 (che C++).
Basta pero' mettere un "int a = 6;" dopo "++z;" (ad esempio) per fare in
modo che non si possa piu' compilare in C89 ma solo in C99 e C++.
Spero questo possa chiarire le idee a BillClinton ;-)
Tommy

 Vedi i vecchi post.
lo puoi per piacere ripetere per me che ho risottoscritto il ng da pochi
giorni?

 wrote in message
news:pan.2004.01.19....@campana.vi.it



Era pericoloso una volta... o meglio lo e' anche ora ma solo se usi il
C89.
In C89 ha una cosa che si chiama "implicit int" e questo puo' creare
problemi ma solo se non e' stato incluso stdlib.h.
Senza il cast avresti un error, con il cast no... e... in realta' c'e'
un errore (stdlib non e' incluso).
Ovviamente questo non vale per il C++ e.... nemmeno per il C99.
Quindi dire che e' pericoloso e' una cosa non del tutto esatta: e'
pericoloso (se si puo' chiamare pericoloso) in C89.
Putroppo quando si parla di C (me compreso) si tende spesso a parlare
ancora di C89!
Ad ogni modo in C il cast sulla malloc e' inutile, questo e' fuori da
ogni ombra di dubbio (in C++ va invece messo, ma.... andrebbe usato new
e non malloc quindi...).
Tommy
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 e non malloc quindi...).
ma se non metto il cast il gcc mi dà un warning....

 Tommy
Molto chiaro, grazie


> ma se non metto il cast il gcc mi dą un warning....
Stai compilando un sorgente C++, no C.
In C++, al contrario del C, il cast su malloc() č obbligatorio, perché
il controllo di tipi č pi forte.

 Vedi i vecchi post.
lo puoi ripetere per chi non segue da molto il ng per piacere?

 ha scritto:

groups.google.com
, e` stato detto e ridetto N volte: il cast puo`
mascherare la mancata inclusione di stdlib.h.
Luca
-- 
Home: 
http://kronoz.cjb.net
Not an editor command: Wq