PDA

Visualizza la versione completa : [c++]funz. sostituisci in stringhe


cleaner
23-11-2008, 00:11
Prima di tutto vi ringrazio anticipatamente qualora qualcuno mi aiutasse..^^
obiettivo:

Realizzare una funzione di nome SOSTITUISCI che, presi come suoi parametri un array
di caratteri A e la sua dimensione d, modifica l'array A sostituendo tutte le sequenze di tre
caratteri ’p’’e’’r’ con il carattere ’x’. La funzione termina restituendo la nuova dimensione
dell’array A compattato. Ad esempio, data la sequenza "perche' non superi?" la sequenza
modificata è "xche' non suxi?".

sto inziando a buttare giù qualcosa, pian piano... solo che ho qualche problemino:



#include <iostream>

using namespace std;

char sostituisci(char a,int d)
{
char a[d]; //error *, guardare sotto
for(int i=0;i<=d;i++)
{

if(a[i] == 'p' || 'e' || 'r') a[i]='x';



}
//funzione ancora in via di sviluppo
return sizeof a[d];
}



int main()
{
char array;
int dimensione;
cout << "inserisci il nome dell'array";
cin >> array;
cout << "inserisci la dimensione";
cin >> dimensione;
sostituisci(array,dimensione);

return 0;
}


*errore restituito:

codeblocks mi ritorna un errore di dichiarazione..."shadows a parameter"..sapete che significa?!

menphisx
23-11-2008, 00:30
Ti aiuterei, ma sapendo per quale scopo potrebbe servire il tuo programma mi astengo.
Scherzo.


char a[d];


è vietato dallo standard.



if(a[i] == 'p' || 'e' || 'r') a[i]='x';

è sbagliatissimo ...

Così come:


return sizeof(a[d]);


Ecco la versione corretta:


void sostituisci(char *a, size_t d)
{
for(int i=0; i < d; i++)
{

if(a[i] == 'p'){
if(a[i + 1] == 'e'){
if(a[i + 2] == 'r'){

int j;
a[i] = a[i + 1] = a[i + 2] = 'x';

//shifta l'array di due
for(j = i + 1; j < d - 1; j++){

a[i] = a[i + 2]

}

}
}
}

}
}


Non l'ho provata, probabilmente è sbagliata o malfunzionante :)

oregon
23-11-2008, 00:31
Ci sono degli errori di "base" di conoscenza della sintassi del linguaggio ma anche logici ...

Intanto, nel main, dichiari un char e non un array di char. La dimensione dovrebbe essere costante se non devi allocare dinamicamente l'array stesso e non ha senso inserire il "nome" dell'array da tastiera ... Inoltre, l'array deve essere inizializzato ... quindi



#define MAX 100

int main()
{
char array[MAX];

strcpy(array, "perche' non superi?");

sostituisci(array, strlen(array));

return 0;
}


Poi, la funzione deve accettare un array di caratteri, quindi un puntatore come primo parametro e, dato che e' un parametro, non devi dichiarare nuovamente l'array dentro la funzione ...

Il ciclo dovra' andare da 0 a d-1 (quindi <d) ... la if e' sbagliata ma la lascio a te e la return deve prevedere la lunghezza dell'array (con la strlen non la sizeof ...) con un valore restituito intero ...



int sostituisci(char *a, int d)
{
for(int i=0; i<d; i++)
{
if(a[i] == 'p' || 'e' || 'r') a[i]='x';



}

return strlen(a);
}

sotoli
23-11-2008, 01:11
Originariamente inviato da menphisx
Ecco la versione corretta:


void sostituisci(char *a, size_t d)
{
for(int i=0; i < d; i++)
{

if(a[i] == 'p'){
if(a[i + 1] == 'e'){
if(a[i + 2] == 'r'){

int j;
a[i] = a[i + 1] = a[i + 2] = 'x';

//shifta l'array di due
for(j = i + 1; j < d - 1; j++){

a[i] = a[i + 2]

}

}
}
}

}
}


Non l'ho provata, probabilmente è sbagliata o malfunzionante :)

Ciao....nell'unica istruzione all'interno del ciclo for hai usato l'indice "i" invece di "j" e secondo me non importa nemmeno mettere a[i+1] = a[i+2] = 'x', basta solo a[i] = 'x'.
A parte queste 2 cose dipese dal fatto che non hai provato il codice, la soluzione secondo me è correttissima.

oregon
23-11-2008, 09:27
La funzione sostituisci, cosi' scritta, puo' incorrere in un "pericoloso" buffer overflow, ad esempio, quando il carattere

'p'

si trova all'ultimo o al penultimo posto della stringa ...

cleaner
23-11-2008, 11:57
Originariamente inviato da menphisx
Ti aiuterei, ma sapendo per quale scopo potrebbe servire il tuo programma mi astengo.
Scherzo.

tranquillo, è solo l'esercizio di un compito dell'uni;) devo esercitarmi a farli..nessun scopo applicativo :zizi:

Mmm, sarò un po noioso ma preferisco analizzare pezzo per pezzo e andare a fondo ai miei problemi, in modo poi da rifarmelo da solo.
Premessa: non abbiamo ancora fatto i puntatori, pensavo si riuscisse a fare senza.




char a[d];


è vietato dallo standard.

In che senso è vietato? Io ho imparato che un array si dichiara in questo modo:
tipo NomeArray[numeroelementi]
ho sbagliato perchè non ho definito la dimensione di d a priori?




if(a[i] == 'p' || 'e' || 'r') a[i]='x';

è sbagliatissimo ...

è sbagliato perchè in questo modo le lettere per essere sostituite dovrebbero trovarsi "di fila"?



Ecco la versione corretta:


void sostituisci(char *a, size_t d)
{
for(int i=0; i < d; i++)
{

if(a[i] == 'p'){
if(a[i + 1] == 'e'){
if(a[i + 2] == 'r'){

int j;
a[i] = a[i + 1] = a[i + 2] = 'x';

//shifta l'array di due
for(j = i + 1; j < d - 1; j++){

a[i] = a[i + 2]

}

}
}
}

}
}


Non sapendo come funzionano i puntatori, il primo parametro della funzione non riesco ancora a capirlo..pensavo si potesse fare anche anche solo tramite array.

Grazie oregon per la parte del main l'ho capita, in effetti non aveva senso far inserire all'utente il nome e la dimensione dell'array. Per quanto riguarda la funzione strlen sinceramente così di primo impatto mi sfugge, andrò a darci un occhiata sul libro;).
Grazie a tutti ovviamente ^^

sotoli
23-11-2008, 15:17
Originariamente inviato da oregon
La funzione sostituisci, cosi' scritta, puo' incorrere in un "pericoloso" buffer overflow, ad esempio, quando il carattere

'p'

si trova all'ultimo o al penultimo posto della stringa ...

Osservazione giustissima!!
Dovrebbe bastare modificare di poco il primo for, quello più esterno:


for(int i=0; i<d - 2; i++)


Originariamente inviato da cleaner

Originariamente inviato da menphisx


char a[d];



è vietato dallo standard.

In che senso è vietato? Io ho imparato che un array si dichiara in questo modo:
tipo NomeArray[numeroelementi]
ho sbagliato perchè non ho definito la dimensione di d a priori?

Esatto.


if(a[i] == 'p' || 'e' || 'r') a[i]='x';

E' sbagliatissimo. quello che avresti voluto fare si scrive così:


if(a[i] == 'p' || a[i] == 'e' || a[i] == 'r') a[i]='x';

Fai attenzione, perché nel modo scritto da te, il compilatore non dà nessun errore poiché sintatticamente è corretto, ma il significato è sbagliato. In quel modo la condizione dell'if è sempre vera perché fai un OR con le codifiche ascii di 'e' e di 'r' che sono sempre diverse da 0 o da NULL.


Originariamente inviato da cleaner
Non sapendo come funzionano i puntatori, il primo parametro della funzione non riesco ancora a capirlo..pensavo si potesse fare anche anche solo tramite array.

Puoi tranquillamente sostituire char *a con char a[], funziona ugualmente.

cleaner
23-11-2008, 19:05
grazie mille delle precisazioni;)


Puoi tranquillamente sostituire char *a con char a[], funziona ugualmente.

in questo modo però non ha più senso che la funzioni accetti due parametri, in quanto se ben ricordo(non ho davanti il libro o l'ide) non si può definire un array senza dimensione(a meno di inzializzarlo).

oregon
23-11-2008, 19:20
Dato che si tratta di una stringa C (un array di char nul terminated), non e' necessaria *in ogni caso* il secondo parametro perche' la strlen ti fornisce la dimensione (in byte) di dati su cui devi operare.

Quindi, puoi scrivere



void sostituisci(char a[])
{
size_t d = strlen(a);
...

Loading