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

    [C++] Rimozione spazi

    Ciao a tutti, sono nuovo del c++, e ho intenzione attraverso questo programma di passare una stringa in ingresso (cosa da implementare) ed in uscita ricavare la stringa stessa senza una particolare parola e senza spazi naturalmente:

    per adesso quello che sono riuscito a scrivere è questo

    codice:
    /* strstr example */
    #include <stdio.h>
    #include <string.h>
    #include <iostream.h>
    
    int main ()
    {
    char str[] ="PROVA DI SCRITTURA";
    char * puntatore;
    int lunghezza;
    
    lunghezza=strlen(str);
    cout << "Stringa inserita:\t " << str << endl;
    cout << "Lunghezza stringa:\t " << lunghezza;
    
    // parola da eliminare
    puntatore = strstr (str,"DI");
    strncpy (puntatore,"  ",2);
    //puts (str);
    cout << "\n\nStringa modificata:\t " << str << endl;
    cout << "Lunghezza stringa:\t " << strlen(str);
    return 0;
    }
    fatto cosi è un pò bruttino lo so, non ho un vettore definito di parole da eliminare nè tantomeno mi toglie gli spazi... potreste darmi una zampa per vedere se riesco ad andare avanti? grazie mille a tutti.

  2. #2
    sono andato un pò avanti intanto nella rimozione degli spazi:

    ho preferito vedere quando ogni carattere non è spazio e copiarlo in nuovo vettore, temp.
    solamente che dal compilatore ricevo il seguente errore: "incompatible types in assignment of `char' to `char[20]'"

    che problema è?

    posto di seguito il codice aggiornato:

    codice:
     
    #include <stdio.h>
    #include <string.h>
    #include <iostream.h>
    
    int main ()
    {
        //dichiarazione delle variabili
        int i;
        char temp[20];
        char str[20] ="PROVA DI SCRITTURA";
        char *puntatore;
        int lunghezza;
        
        lunghezza=strlen(str);
        
        cout << "Stringa inserita:\t " << str << endl;
        cout << "Lunghezza stringa:\t " << lunghezza;
        
        puntatore = strstr (str,"DI");
        strncpy (puntatore,"  ",2);
    
        for (int i = 0; i < lunghezza; i++)
        {    
            if (str[i] != ' ') 
            temp += str[i];
            str = temp;
        }
    }

  3. #3
    Il codice mi sembra un pò strano, ma l'errore
    che ti da è perchè hai scritto:

    codice:
    temp += str[i];
    Cioè, cerchi di incrementare il puntatore temp del valore di un carattere

    dovresti avere qualcosa di simile

    codice:
    temp[x] += str[i];

  4. #4
    prova così.

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
    
    	//dichiarazione delle variabili
    	int i;
    	char temp[20];
    	char *tmp = temp;
    
    	const char *str ="PROVA DI SCRITTURA";
    	int lunghezza;
        
    	lunghezza=strlen(str);
        
    	cout << "Stringa inserita:\t " << str << endl;
    	cout << "Lunghezza stringa:\t " << lunghezza << endl;
        
    	while ( *str ) {
    
    		if ( !isspace ( *str ) ) {
    			*tmp = *str;
    			tmp++;
    		}
    
    		str++;
    
    	}
    
    	*tmp = '\0';
    
    	cout << temp << endl;
    
    	return ( 0 ) ;
    
    }

  5. #5
    funziona grazie, però:

    integrando la soluzione della rimozione spazi, nel programma originale, il compilatore devc++ compila senza errori, ma all'esecuzione, il programma termina con errore di windows: ...la memoria doveva essere written...

    nuovo codice aggiornato:


    codice:
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
    	//dichiarazione delle variabili
    	int i;
    	char temp[20];
    	char *tmp = temp;
    	char *puntatore;
    
    
    	const char *str ="PROVA DI SCRITTURA";
    	int lunghezza;
        
    	lunghezza=strlen(str);
        
    	cout << "Stringa inserita:\t " << str << endl;
    	cout << "Lunghezza stringa:\t " << lunghezza << endl;
    	
    	puntatore = strstr (str,"DI");
        strncpy (puntatore,"  ",2);
    
        
    	while ( *str ) {
    		if ( !isspace ( *str ) ) {
    			*tmp = *str;
    			tmp++;
    		}
    		str++;
    	}
    
    	*tmp = '\0';
    	cout << temp << endl;
    	return ( 0 ) ;
    }
    grazie nuovamente!

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    puntatore è un puntatore a NULL.. se usa la strcpy o una strstr su un puntatore non allocato ti da errore.. strano che il compilatore non te lo dica con un warning

  7. #7
    no, puntatore non è null, il problema che non puoi scrivere parti di stringa allocata staticamente perchè si trova nella memoria protetta

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
    	//dichiarazione delle variabili
    	int i;
    	char temp[20];
    	char *tmp = temp;
    	char *puntatore;
    
    
    	char *str = new char[20];
    	strcpy(str,"PROVA DI SCRITTURA");
    	int lunghezza;
        
    	lunghezza=strlen(str);
        
    	cout << "Stringa inserita:\t " << str << endl;
    	cout << "Lunghezza stringa:\t " << lunghezza << endl;
    	
    	puntatore = strstr (str,"DI");
       strncpy (puntatore,"  ",2);
    
        
    	while ( *str ) {
    		if ( !isspace ( *str ) ) {
    			*tmp = *str;
    			tmp++;
    		}
    		str++;
    	}
    
    	*tmp = '\0';
    	cout << temp << endl;
    	return ( 0 ) ;
    }
    così funziona perchè è allocata dinamicamente, anche se non pulisce la memoria, ma lo correggi tu.
    ciao
    sergio

  8. #8
    Grazie a mondobimbi ho risolto, il codice funziona.
    Adesso ho voluto complicare un pò le cose, e anzichè passargli un'unica parola, è mia intenzione passare un array di parole, dichiarato nel main, e attraverso l'uso della funzione di ripulitura, rifare ciò che è stato fatto in precedenza. Con un semplice ciclo FOR pensavo di poter risolvere invece, funziona solo in parte e come al solito non riesco a cancellare la congiunzione e gli spazi.
    Nella parte dell'IF si dovrebbe rilevare la congiunzione e sostituirla con degli spazi vuoti, nel WHILE invece trimmare gli spazi, però ricevo errori di memoria, potete vedere per cortesia?
    spero che i commenti nel programma possano aiutarvi. GRAZIE DI NUOVO!!!

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    
    
    using namespace std;
    
    
    int ripulitura (char via[50][50])
    {
    
    	// definizione delle variabili e puntatori
    	int lunghezza_i;
    	int lunghezza_cong;
    	int i = 0;
    	int l = 0;
    	char temp[20];
    	char *tmp = temp;
    	char *puntatore;
    
    	
    	// definizione della congiunzione
    	char cong1[] = " DI ";
    	char *cong = cong1;
    	
    	lunghezza_cong = strlen(cong);
    
    
    	// definisce la lunghezza della stringa di partenza e della congiunzione
    	for (l=0; l<4; l++)
    	{
    		
    		i = 0;
    		lunghezza_i= strlen(via[l]);
    
    		// stampa la stringa di partenza e la sua lunghezza
    		cout << "\nStringa:\t "<< via[l] << endl;
    		cout << "Lunghezza:\t " << lunghezza_i << endl;
    
    		// ricerca della parola da eliminare
    		// STRSTR: ritorna in punt,il puntatore nella posizione della prima ripetizione della congiunzione
    		puntatore= strstr (via[l],cong);
    
    		// inserisce lo spazio dove ha trovato la congiunzione
    		// lo spazio è indicato col suo carattere ascii 32
    		if (puntatore != 0)
    		{
    			while (i < lunghezza_cong)
    			{
    				*(puntatore+i)=32;
    				i++;
    			}
    		}
    
    		while (via) 
    		{
    
    		//la funzione ritorna un valore diverso da 0 se ho uno spazio
    		if ( !isspace (*via[l]))
    			{
    			*tmp = *via[l];
    			tmp = tmp + 1;
    			}
    		via = via + 1;
    		}
    
    		// inserisco il carattere di fine stringa
    		*tmp = '\0';
    
    		// stampo la stringa prova di spazi
    		cout << "Ripulita:\t " << temp << endl; 
    
    	}
    	return 0;
    
    }
    
    
    void main()
    {
    
    	// definisco un vettore di lunghezza fissa
    	// vie_viario indica l'elenco delle vie giuste
    
    	char vie_viario[50][50] = {"VIA DELLE PERLE","VIA DELLE TERME","VIA DI PROVA","VIA DI CITTA"};
    
    	// richiamo la funzione di ripulitura
    
    	int d = ripulitura(vie_viario);
    }
    so che è un programma un pò strano ma in sostanza, ciò che dovrebbe fare il programma è restituire le parole dell'array, ripulite dalle congiunzioni (per adesso solo DI) e dagli spazi:
    esempio:

    VIA DELLE PERLE -> VIAPERLE

  9. #9
    qualcuno sa come posso procedere su quanto sopra? Grazie di nuovo a tutti

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.