Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema con separatori in C

    Ciao a tutti,
    innanzitutto mi presento, sono Carlo ed ho iniziato a programmare da circa 6 mesi iniziando dal C, preciso che non avevo altre esperienze se non qualche script e utilizzo quel poco che so di programmazione per alleggerire delle operazioni che tendenzialmente sarei costretto a fare manualmente.
    Ho realizzato un programmino per leggere dei dati su di un file txt e inserire i dati in una struttura per successive elaborazione dei dati.
    Il programma ha funzionato bene fino ad un caso dove tra un separatore e l'altro (la virgola in questo caso) non è stato inserito nulla, quindi invece di avere una struttura come gli altri tipo "dato1,dato2,dato3" ha un campo vuoto nel quale non vengono inseriti spazi o che bensi arriva come "dato1,,dato3" e purtroppo non posso modificare come questo file viene generato.

    Il mio programmino fa parsing con un fscanf ma quando trova i separatori attaccati inizia a mettere dati "sporchi", incollo il codice un pò ripulito in quanto i campi sarebbero 22 ma evito di intasare il tutto per cose ripetute:

    codice:
    fscanf(stream1,"%[^\','],%[^\','],%[^\',']%s",nuova.dato1,nuova.dato2,nuova.dato3);
    Esiste un modo per fargli interpretare i due separatori incollati come spazio vuoto?
    Ho pensato a dei controlli sul carattere attuale e sul successivo però appesantirei il tutto, dovrei tornare a inizio riga e insomma...credo che seguendo questa strada andrei a complicare il tutto di parecchio.

    Grazie
    Carlo

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Io utilizzerei una funzione che divida una stringa in token...
    codice:
    #include <stdio.h>#include <string.h>
    
    
    char *tok(char *a, char *sep) {
    	static char * b;
    	if(a != NULL) {
    		b = a;
    	}
    	if(b == NULL) return NULL;
    	char *tmp = b;
    	b = strpbrk(b, sep);
    	if(b == NULL) return tmp;
    	*b++ = '\0';
    	return tmp;
    }
    
    
    int main(void) {
    	char a[255];	
    	gets(a);	
    	char *b = tok(a, ",");
    	while(b != NULL) {
    		printf("%s\n", b);
    		b = tok(NULL, ",");
    	}
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Non conoscevo questo tipo di soluzione, ci provo subito!

    Grazie
    CC

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.