PROBLEMA rimozione caratteri desiderati di una stringa tramite un array di caratteri

davidson

Nuovo Utente
33
5
Come detto da Andretti sopra, 2 loops.

C++:
#include <iostream>
using namespace std;
int main()
{
    char word[] = "Hell.o W@orld";
    char badSymbols[] = ".@[]{}()";

    //controlla ogni caratter
    for (char* currentChar = word; *currentChar != '\0' ; currentChar++)
    {   //controlla contro ogni simbolo
        for (char* symbol = badSymbols; *symbol != '\0'; symbol++)
        {
            //se un carattere indesiderato viene trovato
            if (*currentChar == *symbol) {
                //rimuovilo
                char* next = currentChar;
                while (*next != '\0') {
                    *next = *(next + 1);
                    next++;
                }
            }
        }
    }

    for (char* ch = word; *ch != '\0'; ch++){
        cout << *ch;
    }

    return 0;
}

nel codice che rimuove, puoi anche risparmiare una linea scrivendo questo (anzichè next++ in una linea separata)
C++:
while (*next != '\0'){
       *next++ = *(next + 1);
}

ho problemi con il codice nel main richiamo la funzione rimuovistringa(stringa);
dove stringa è un array di caratteri;
nella funzione gli passo un puntatore a caratteri;
ma non la stampa la stringa
 

davidson

Nuovo Utente
33
5
questo è il codice
Concordo, ho citato la cosa più per mostrargli una cosa che suppongo non sappia, ma non piace neppure a me una linea di codice simile xD
Esatto, ecco perche' consigliavo l'uso di un buffer, si usa il doppio della memoria ma fila via molto più liscio.
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

    void rimuovi_caratteri(char *strpointer);


    void rimuovi_caratteri(char *strpointer)
{
    char ch[]= ".;][}{()";


    // puntatore che punta a ch/
    char *chpointer;


    chpointer = ch;


    //puntatore che punterà all'elemento dell'array nel main che conterrà il carattere da eliminare//

    char *removechr;





  
       //controllo caratteri dell'array nel main//

    while(*strpointer != '\0')
  
    {
        while(*chpointer != '\0')

        {
            if(*strpointer == *chpointer)

            {

                // se i caratteri confrontati sono uguali allora removechr punterà al carattere indesiderato//

                removechr = strpointer;

                while(*removechr != '\0')

                {
                    *removechr = *(removechr + 1);

                    removechr++;


                }


          
          
          
            }

        }

    }

          
}



      


                int main()

            {  
                char stringa[] = "c[) iao";

                int i;


                int dim;

                dim =strlen(stringa);

              
              
            rimuovi_caratteri(stringa);

            for ( i=0;i<dim;i++)
              
            {

                printf("%c",stringa[i]);


            }

;

                printf("\n");

                return 0;
            }
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
Domanda: in che modo tutte quelle linee vuote una dietro l'altra stanno contribuendo a rendere il tuo codice più leggibile?
Non so che monitor usi, ma nel mio devo "scrollare" più di una volta (ben cinque) per poter vedere il tuo codice, il che non aiuta, sopra tutto se chiedi ad altri di leggerlo :/
Inoltre ripeto il punto uno che ho scritto nella pagina 1, non ti serve avere la dichiarazione ("signature") della funzione seguita dalla definizione della stessa.
La definizione è sufficiente.

la linea sotto non serve
C:
void rimuovi_caratteri(char *strpointer);
 
Ultima modifica:

davidson

Nuovo Utente
33
5
Domanda: in che modo tutte quelle linee vuote una dietro l'altra stanno contribuendo a rendere il tuo codice più leggibile?
Non so che monitor usi, ma nel mio devo "scrollare" più di una volta (ben cinque) per poter vedere il tuo codice, il che non aiuta, sopra tutto se chiedi ad altri di leggerlo :/
Inoltre ripeto il punto uno che ho scritto nella pagina 1, non ti serve avere la dichiarazione ("signature") della funzione seguita dalla definizione della stessa.
La definizione è sufficiente.

la linea sotto non serve
C:
void rimuovi_caratteri(char *strpointer);
Per me è buona abitudine farlo
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
bhe mi sembra un pò come dire che è buona abitudine scrivere:
C++:
int x;

x = 0;
quando puoi ugualmente scrivere:
C++:
int x = 0;

Semplicemente più linee da valutare (che in questo caso non aggiungono nulla di utile) per chi ora o in futuro dovrà leggere il tuo codice. Se non fai questo cambiamento per te, suggerisco di farlo per gli altri, sopratutto se si richiede agli altri di leggerlo, tienilo il più essenziale/compatto/comprensibile possibile :)
 
Ultima modifica:
  • Mi piace
Reazioni: Andretti60

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili