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

    [C] Normalizzazione di un file

    Salve a tutti. Ho un problema con questo programma. Praticamente carico in memoria delle stringhe da un file con la funzione fgets() e normalizzo stringa per stringa, cioè elimino spazi in testa ed in coda(trim), spazi doppi, segni di punteggiatura e se il carattere è minuscolo lo trasformo in maiuscolo. Il mio problema sta nel fatto che se leggo una stringa di spazi bianche, quando faccio il trim dovrebbe diventare vuota, cioe con s[0]='\0', però quando scrivo su file mi riscrive la stringa bianca che non voglio, perchè? non dovrebbe scrivere nulla?
    Ecco il codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #define dmax 100
    
    typedef char stringa[dmax+1];
    
    void trim(char *string);
    void normalizza(char *s);
    
    int main()
    {
    	stringa EL[dmax];
    	int i=0;
    	int dim=0;
    	char nomefile[30];
    	FILE *fp;
    	printf("Inserisci il nome del file che intendi normalizzare: ");
    	gets(nomefile);
    	fp=fopen(nomefile,"r");
    	if(fp==NULL) printf("ERRORE\a\a\a");
    	else
    	{
    		while((fgets(EL[i++],dmax,fp))!=NULL);
    		dim=i;
    		for(i=0;i<dim;i++)
    		{
    			normalizza(EL[i]);
    		}
    		fp=fopen(nomefile,"w");
    		for(i=0;i<dim;i++)
    		{
    		    if(strlen(EL[i])!=0)
    			fputs(EL[i],fp);
    		}
    	}
    	system("pause>nul");
    	fclose(fp);
    	return 0;
    }
    
    void trim(char *string)
    {
    	char s2[dmax];
    	int i,j,dim;
    	for(i=0;string[i]==' ';i++);
    	dim=strlen(string);
    	while(isblank(string[dim-1]))
    		  dim--;
    	for(j=0;i<dim;j++,i++)
    		s2[j]=string[i];
    	s2[j]='\0';
    	strcpy(string,s2);
    }
    
    void normalizza(char *s)
    {
    	int i,j=0;
    	char s2[dmax+1];
    	for(i=0;i<strlen(s);i++)
    	{
    		if(!(ispunct(s[i])) && !(s[i]==s[i+1] && s[i]==' '))
    		{
    			if(s[i]>='a' && s[i]<='z') s[i]=s[i]-'a'+'A';
    			s2[j++]=s[i];
    		}
    	}
    	s2[j]='\0';
    	for(i=0;i<strlen(s2);){
    	    if(s2[i]==s2[i+1] && s2[i]==' ')
    	    for(j=i;j<strlen(s2);j++)
    	        s2[j]=s2[j+1];
    	else i++;}
    	if(strlen(s2)!=0) trim(s2);
    	strcpy(s,s2);
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Intanto, sei sicuro che la stringa non contenga dei tabulatori (carattere ASCII 9) che scambi per spazi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    No, non lo so, cioè io leggo un file tipo questo:

    codice:
    ciao  ciao    ociiocoak   .,,,m,m,m , , ,
    
    lfklp lp k oko kj oio
    e l'output dovrebbe essere
    codice:
    CIAO CIAO OCIIOCOAK MMM
    LFKLP LP K OKO KJ OIO
    La riga bianca che lo lasciato nel file di output, la legge come tanti caratteri di tabulazione?

    Secondo me quando uso la funzione trim, usando la funzione strlen, se ci sono caratteri come \t \n & co. non li dovrebbe contare, quindi acquisendo la stringa di bianchi dovrebbe avere dim=0, di conseguenza la mia funzione trim la trasforma in una stringa vuota, cioè contiene solo il \0, e quando faccio fprintf non dovrebbe scrivere nulla secondo me, ma invece....

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da darth fener
    Secondo me quando uso la funzione trim, usando la funzione strlen, se ci sono caratteri come \t \n & co. non li dovrebbe contare, quindi acquisendo la stringa di bianchi dovrebbe avere dim=0, di conseguenza la mia funzione trim la trasforma in una stringa vuota, cioè contiene solo il \0, e quando faccio fprintf non dovrebbe scrivere nulla secondo me, ma invece....
    Eh?

    Ma perche' non fermi l'esecuzione del programma alla fine della funzione e controlli (in debug) il contenuto dei singoli caratteri della stringa per vedere se ci sono dei \t ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Perchè il debug di codeblocks mi sembra strano, il \n lo inserisce nella stringa successiva e mi fa vedere, per esempio il \n di s[i], me lo fa vedere in s[i+1]???Comunque il mio codice ti sembra corretto?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da darth fener
    Comunque il mio codice ti sembra corretto?
    Mah ... non l'ho provato ... anche perche' non compila ... cos'e' isblank ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    è una funzione che si trova nella libreria ctype, serve per controllare se il carattere che gli passo è un bianco(uno spazio) o no

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    ctype e' un include, non una libreria.

    La isblank e' nello standard C99 (alcuni compilatori che non aderiscono a tale standard, non la prevedono ...). Puo' essere sostituita da

    #define isblank(c) ((c) == ' ' || (c) == '\t')

    Nel codice della normalizza dovresti, prima di tutto, sostituire tutti i tab con degli spazi, con

    codice:
    for(i=0;i<strlen(s);i++)
        if(s[i]=='\t') s[i]=' ';
    e prima della fopen in scrittura dovresti eseguire la fclose del file precedentemente aperto in lettura.

    In piu' (ma non l'ho provato) penso che dovrebbe essere

    dim=i-1;

    e non

    dim=i;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Ok, grazie. Comunque alla fine ho trovato l' "errore". Quando vado a capo, si prende il \n dal file, e, cosa che io non sapevo, facendo strlen(EL[i]), ritorna 1.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.