PDA

Visualizza la versione completa : [C] Ricerca caratteri doppi in una stringa copia (singola) in un vettore


toni00c
05-02-2011, 11:49
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








/* 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

toni00c
05-02-2011, 12:22
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







#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 ;


}

Laikius91
05-02-2011, 12:25
Dunque dunque in pseudocodice dovrebbe essere una cosa cos:

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


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):



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 :)

Laikius91
05-02-2011, 12:28
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:


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

Laikius91
05-02-2011, 13:06
Ultima dimenticanza: dopo il ciclo, in result devi inserire il terminatore '\0' ! :)

toni00c
05-02-2011, 13:13
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:


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

Laikius91
05-02-2011, 14:05
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:



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:





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 :)

toni00c
05-02-2011, 14:44
hai ragione , ma il problema che nella nuova stringa una carattere doppio ,non deve comparire due volte

Laikius91
05-02-2011, 15:49
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!

Loading