Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703

    [c++]funz. sostituisci in stringhe

    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:

    codice:
    #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?!

  2. #2
    Ti aiuterei, ma sapendo per quale scopo potrebbe servire il tuo programma mi astengo.
    Scherzo.
    codice:
    char a[d];
    è vietato dallo standard.

    codice:
    if(a[i] == 'p' || 'e' || 'r') a[i]='x';
    è sbagliatissimo ...

    Così come:
    codice:
    return sizeof(a[d]);
    Ecco la versione corretta:
    codice:
    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

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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

    codice:
    #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 ...

    codice:
    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);
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di sotoli
    Registrato dal
    Mar 2008
    Messaggi
    150
    Originariamente inviato da menphisx
    Ecco la versione corretta:
    codice:
    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.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    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

    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.
    codice:
    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?
    codice:
    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:
    codice:
    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 ^^

  7. #7
    Utente di HTML.it L'avatar di sotoli
    Registrato dal
    Mar 2008
    Messaggi
    150
    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:

    codice:
    for(int i=0; i<d - 2; i++)
    Originariamente inviato da cleaner
    Originariamente inviato da menphisx
    codice:
    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.

    codice:
    if(a[i] == 'p' || 'e' || 'r') a[i]='x';
    E' sbagliatissimo. quello che avresti voluto fare si scrive così:

    codice:
    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.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    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).

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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

    codice:
    void sostituisci(char a[])
    {
        size_t d = strlen(a);
        ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.