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

    [C] ricerca caratteri doppi in una stringa copia (singola) in un vettore

    ciao ragazzi mi trovo a risolvere un caso interessante ;

    ho una stringa di "X" caratteri e devo trovare in essa i caratteri doppi e copiarli singolarmente in un nuovo vettore , in modo da leggere in esso un altra stringa ,

    cioè caratteri singoli e carattere di terminazione '\0' alla fine del vettore



    codice:
    
    
    /* questo programma deve leggere una stringha , trovare i caratteri che si ripetono almeno due volte e
    copiarne uno di essi in un altra stringa */
    
    char nome [] = "antonino" ;
    char doppie [4] ; /* Non so a priori le dimensioni del nuovo vettore
    char *tempPtr  ;
    char temp ;
    char *lettera  ;
    
    int count = 0 ;
    int i = 0 ;
    int j = 1 ;
    
    
    lettera = nome ;
    tempPtr = nome + 1 ;
    
    
    
    while ( *lettera != '\0' ) 
    
    {
    	
    	temp = *lettera ;
    
    	while (*tempPtr != '\0' )
    
    	{
    
    		if (*tempPtr == temp   && count < 1 )
    		{
    			doppie [i] = temp ;
    	        i++ ;
    			count++ ;
    		}
    
    		tempPtr++ ;
    
    	}
    	count = 0 ;
    
    	j++ ;
    
    	if ( j < 8 )
            tempPtr = nome + j ;
    
    	lettera++ ;
    	
    
    }
    
    
    
    printf ("%c" , doppie [0] ) ;
    printf ("%c\n\n" , doppie [1] ) ;
    printf ("%c\n\n" , doppie [2] ) ;
    doppie [3] =  '\0' ;
    printf ("%s" , doppie  ) ;
    
    
    
    
    	system ("PAUSE") ;
    
    	return 0 ;
    
    
    }

    allora il problema è questo ;

    1) non so a priori quanti caratteri doppi troverò nella stringa madre, e quindi che dimensioni deve avere il Nuovo vettore

    2)la stringa madre deve essere esaminata un carattere alla volta con tutti gli altri caratteri , ma qualora un carattere sia gia stato esaminato non deve essere più preso in considerazione
    ; se il carattere nome[0] è stato confrontato con i restanti caratteri , il nuovo confronto deve partire da nome[1] e così via ;
    mai ripartire dall'inizio , è spreco di risorse


    3)il programma deve essere il più performante possibile , quindi meno memoria sprecata ( con variabili temporanee ad es.)




    vorreste aiutarmi un po ?

    pensavo di usare qualche funzione della libreria string.h , ma non ho trovato ancora nulla di che

    grazie

  2. #2
    allora questa è una versione del programma ritoccato con le funzioni della libreria standard , ma il problema è che

    1) non so a priori la dimensione del nuovo vettore
    2)mi inserisce nel nuovo vettore caratteri doppi




    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct oggetto {
    	int a ;
    	char b [10] ;
    	char n [10] ;
    	float  e ;
    } oggetto ;
    
    typedef oggetto *oggettoPtr ;
    
    
    int main ()
    
    {
    
    /* questo programma deve leggere una stringha , trovare i caratteri che si ripetono almeno due volte e
    copiarne uno di essi in un altra stringa */
    
    char nome [] = "antonino" ;
    char doppie [4] ;
    
    char *tempPtr  ;
    char *lettera ;
     
    char *tempPtr2 = NULL ;
    
    char temp ;
    int i = 0 ;
    int j ;
    
    lettera = nome ;
    tempPtr = nome ;
    
    
    
    
    
    while ( *lettera != '\0' )
    
    {
    	temp = *lettera ;
    	tempPtr++ ;
    	
    	if ((tempPtr2 = strchr ( tempPtr , temp ) ) != NULL )
    	{
    		
    	
                doppie[i] = *tempPtr2 ;
    	        i++ ; 
    
    	}
    
    
    	lettera++ ;
    
    }
    
    doppie[i] = '\0' ;
    
    
    
     
    printf("%s\n" , doppie) ;
    
    
    	system ("PAUSE") ;
    
    	return 0 ;
    
    
    }

  3. #3
    Dunque dunque in pseudocodice dovrebbe essere una cosa così:

    1) copi l'indirizzo del primo elemento della stringa madre, facendo tipo:

    codice:
    char* temp = nome;
    2) ti fai una bella funzioncina (chiamata ad esempio 'quantiCar') che, passati una stringa e un carattere, restituisca quante volte il carattere è presente nella stringa;

    3) fai un ciclo del tipo (result è la stringa risultato):

    codice:
    int i = 0;
    
    while (*nome != '\0')
    {
            if (strchr (result, *nome) != NULL) /* strchr (char* s, char t) ritorna il puntatore alla prima  
                   nome++;                                occorrenza di t in s, o NULL se t non è presente */
    
            else if (quantiCar (temp, *nome) > 1)
            {
                    result[i] = *nome;
                    i++;
                    nome++;
            }
    
            else 
                   nome++;
    }

    Prova un po' e poi dimmi
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  4. #4
    Ah per le dimensioni di result non c'è un modo per sapere esattamente quanto spazio occorra a mio parere... la cosa migliore è allocare lo spazio necessario per il caso peggiore, ossia quello in cui la parola contiene tutti caratteri doppi, tipo "aabbccdd"..

    Quindi direi di fare:

    codice:
    char result [(strlen(nome) / 2) + 1];
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  5. #5
    Ultima dimenticanza: dopo il ciclo, in result devi inserire il terminatore '\0' !
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  6. #6
    Originariamente inviato da Laikius91
    Ah per le dimensioni di result non c'è un modo per sapere esattamente quanto spazio occorra a mio parere... la cosa migliore è allocare lo spazio necessario per il caso peggiore, ossia quello in cui la parola contiene tutti caratteri doppi, tipo "aabbccdd"..

    Quindi direi di fare:

    codice:
    char result [(strlen(nome) / 2) + 1];

    ciao laikius , la seccatura è proprio quella !
    avrei bisogno di allocare quella memoria solo per quello che mi serve realmente in run-time magari (sarebbe anche meglio)

    2) la funzione quantiCar dovrebbe restituire il carattere in questione ( se si presenta doppio o più nella stringa madre )

    grazie

  7. #7
    No, la funzione quantiCar deve restituire un intero, indicante, quante volte il carattere passato è presente nella stringa passata!

    Detto ciò, per fare quello che chiedi tu con l'allocazione si potrebbe fare:

    codice:
    char* temp = nome, result;
    int n = 0, i = 0, j;
    
    j = 0;
    while (nome[j] != '\0')
    {
           if (quantiCar (temp, nome[j]) > 1) n++;
           j++;
    }
    
    result = (char*) malloc (sizeof(char)*n);
    Poi mi sa che il compilatore si incasina un po' con i puntatori nel pezzo di codice che avevo scritto prima, quindi dovresti fare tipo:



    codice:
    j = 0;
    while (nome[j] != '\0')
    {
            if (strchr (result, nome[j]) != NULL) /* strchr (char* s, char t) ritorna il puntatore alla prima  
                   j++;                                occorrenza di t in s, o NULL se t non è presente */
    
            else if (quantiCar (temp, nome[j]) > 1)
            {
                    result[i] = nome[j];
                    i++;
                    j++;
            }
    
            else 
                   j++;
    }
    
    result[i] = '\0';

    Lascio a te la funzione 'quantiCar' dai
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  8. #8
    hai ragione , ma il problema è che nella nuova stringa una carattere doppio ,non deve comparire due volte

  9. #9
    Originariamente inviato da toni00c
    hai ragione , ma il problema è che nella nuova stringa una carattere doppio ,non deve comparire due volte
    Io l'ho provato e funziona normalmente.. i caratteri che compaiono più di una volta nella stringa madre, vengono copiati una sola volta te lo assicuro!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

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.