Salvare stringhe dopo strtok

di il
9 risposte

Salvare stringhe dopo strtok

Salve a tutti, vi spiego il problema, ho creato un file CSV con varie stringhe e numeri, ovviamente, per separare le stringhe dai vari segni di punteggiatura creati dal file csv, ho usufruito della funzione strtok e fin qui tutto ok.
Adesso dovrei prendere ogni singola stringa e salvarla in una struct, mi sto mangiando la testa per capire come fare... per farvi capire meglio lascio il codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NOME 20

typedef struct{
	char nome_utente[NOME];
	char nome[NOME];
	char cognome[NOME];
	char cant_pref[NOME];
	struct{
		int anno_nascita;
		int mese_nascita;
		int giorno_nascita;
		int giorno_iscr;
		int mese_iscr;
		int anno_iscr;
	}informazioni;
}utente;


int main(){
   char s[100]; int i=0; utente utente[50];
   FILE *utenti;
   utenti=fopen("Utenti.csv","r");
   while(!feof(utenti)){
   fgets(s,100,utenti);

   printf("La stringa da separare e':%s\n\n"
		   "La stringa separata:\n",s);

   char*token=strtok(s,";");

   while(token!=NULL){
	   printf("%s\n",token);
	  
	   token=strtok(NULL,";");

   }
   }



   system("pause");
   return 0;

}
Riesco quindi, a separare l'intera stringa per ogni dato che mi serve, dopodichè non capisco come poter prendere la stringa separata, ad esempio del cognome, e salvarla nella variabile utente(i).cognome.
Spero possiate darmi una mano, grazie in anticipo.

9 Risposte

  • Re: Salvare stringhe dopo strtok

    Usa la funzione strcpy
  • Re: Salvare stringhe dopo strtok

    oregon ha scritto:


    Usa la funzione strcpy
    Ciao,grazie della risposta ho provato a fare così:
     #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define NOME 20
    
    typedef struct{
    	char nome_utente[NOME];
    	char nome[NOME];
    	char cognome[NOME];
    	char cant_pref[NOME];
    	struct{
    		int anno_nascita;
    		int mese_nascita;
    		int giorno_nascita;
    		int giorno_iscr;
    		int mese_iscr;
    		int anno_iscr;
    	}informazioni;
    }utente;
    
    
    int main(){
       char s[100]; char array[20]; utente utente[100]; int i=0;
       FILE *utenti;
       utenti=fopen("Utenti.csv","r");
    
       while(!feof(utenti)){
       fgets(s,100,utenti);
    
       printf("La stringa da separare e':%s\n\n"
    		   "La stringa separata:\n",s);
    
       char*token=strtok(s,";");
    
    
       while(token!=NULL){
    	   i=0;
    	   printf("%s\n",token);
    	   strcpy(utente[i].nome_utente,token);
    	   strcpy(utente[i].nome,token);
    	   strcpy(utente[i].cognome,token);
    	   strcpy(utente[i].cant_pref,token);
    	   utente[i].informazioni.giorno_nascita=(int)token;
    	   utente[i].informazioni.mese_nascita=(int)token;
    	   utente[i].informazioni.anno_nascita=(int)token;
    	   utente[i].informazioni.giorno_iscr=(int)token;
    	   utente[i].informazioni.mese_iscr=(int)token;
    	   utente[i].informazioni.anno_iscr=(int)token;
    	   token=strtok(NULL,";");
           i++;
       }
       }
    
    
    
    for(i=0;i<20;i++){
    	printf(""
    			"Cognome:%s\n",utente[i].cognome);
    }
    
    
       system("pause");
       return 0;
    
    }
    
    se provo a stampare i cognomi non mi esce nulla.... sicuramente non è il procedimento giusto, sicuramente sbaglio su qualche ciclo ma non so quale...sapresti consigliarmi? Grazie
  • Re: Salvare stringhe dopo strtok

    Nella while al primo giro avrai il nome, al secondo il cognome e così via.
  • Re: Salvare stringhe dopo strtok

    Ovvero a blocchi...

    i=0;
    while !feof
    ...lettura e strtok...
    j=0;
    while token
    if j==0 strcpy del nome
    if j==1 strcpy del cognome
    ...
    strtok
    j++
    ---------
    i++
    ---------

    E ricorda che per convertire in intero si usa la funzione atoi. Non si fa come hai scritto tu.
  • Re: Salvare stringhe dopo strtok

    oregon ha scritto:


    Ovvero a blocchi...

    i=0;
    while !feof
    ...lettura e strtok...
    j=0;
    while token
    if j==0 strcpy del nome
    if j==1 strcpy del cognome
    ...
    strtok
    j++
    ---------
    i++
    ---------

    E ricorda che per convertire in intero si usa la funzione atoi. Non si fa come hai scritto tu.
    Grazie mille adesso ci sono riuscito, senza il tuo aiuto sarei rimasto bloccato.
    So di chiedere troppo ma sapresti dirmi la funzione di j? Da solo non ci sarei mai arrivato...
    Per convertire char con int e viceversa mi hanno insegnato di effettuare il cast (che è quello che ho usato io), purtroppo della funzione atoi non ne ho ancora sentito parlare (forse è troppo presto per le conoscenze che mi hanno dato), grazie comunque del consiglio cercherò di conoscerlo autonomamente.
    Grazie sentiti ancora
  • Re: Salvare stringhe dopo strtok

    Continuando il programma, ho notato che è meglio utilizzare atoi, grazie ancora
  • Re: Salvare stringhe dopo strtok

    I è il contatore di righe (record) e j è il contatore di colonne (campi)

    Il cast non c'entra nulla dato che operi su un puntatore ad un buffer di caratteri ASCII. Con il cast avrai solamente il valore del puntatore ma non il dato a cui punti. La funzione atoi converte dai caratteri ASCII al valore intero decimale.
  • Re: Salvare stringhe dopo strtok

    oregon ha scritto:


    I è il contatore di righe (record) e j è il contatore di colonne (campi)

    Il cast non c'entra nulla dato che operi su un puntatore ad un buffer di caratteri ASCII. Con il cast avrai solamente il valore del puntatore ma non il dato a cui punti. La funzione atoi converte dai caratteri ASCII al valore intero decimale.
    Capito! Una sorta di matrice allora

    Felice di aver conosciuto la funzione atoi potrebbe essermi utile anche in futuro, grazie ancora
  • Re: Salvare stringhe dopo strtok

    Puoi ancge studiare la funzione strtol più standard
Devi accedere o registrarti per scrivere nel forum
9 risposte