RISOLTO Programmino C++ con le stringhe

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

marco42

Nuovo Utente
Messaggi
55
Reazioni
5
Punteggio
22
salve ragazzi ho un probelma da risolvere, consiste nella gestione di una stringa, in pratica l'utente deve immettere una stringa di qualsiasi lunghezza e segnalare una parola con un carattere speciale che dovrà essere poi eliminato dal programma es. "ciao a @tutti@" in questo caso 'tutti' è la parola da eliminare (poichè evidenziata da @@) quindi devo ottenere come risposta dal programma "ciao a"
spero mi possiate aiutare, doveri risolverlo usando cicli for while e array.

grazie in anticipo.
 
Ultima modifica:
Potresti copiare la stringa in un array di char, con un for fare un controllo dove trova il primo carattere speciale e tutto ciò che c'è prima dell'altro carattere prende un valore nullo.
 
Potresti copiare la stringa in un array di char, con un for fare un controllo dove trova il primo carattere speciale e tutto ciò che c'è prima dell'altro carattere prende un valore nullo.
Ciao lugio grazie per aver risposto, in effetti è proprio questo che vorrei fare ma non so come, potresti aiutarmi ??
 
Non conosco C++, ma le stringhe non funzionano come degli array di char?( non dico che siano come in C, con lo \0 terminale ). Dovresti riuscire ad accedere al singolo char con stringa. Copi ogni carattere finchè non trovi @ ed eventualmente ricominci quando reincontri un altro @.
 
Grazie per avermi risposto
Purtroppo di quello che c’è scritto in quel link non ci capisco molto come detto dovrei risolverlo usando cicli while e for ed usando array di char o string
Con quel comando puoi copiare una stringa in un array di char, per poi assegnare valore nullo in quella posizione dell'array dove sono presenti i caratteri fra le 2 chiocciole
 
Non conosco C++, ma le stringhe non funzionano come degli array di char?( non dico che siano come in C, con lo \0 terminale ). Dovresti riuscire ad accedere al singolo char con stringa. Copi ogni carattere finchè non trovi @ ed eventualmente ricominci quando reincontri un altro @.
In effetti si le stringhe sono degli array di char ma il problema è che non riesco a far cancellare la parola
 
String ha un costruttore che accetta un array di char ( che termini con \0 o NULL non so ).
Ti basta istanziare un array di lunghezza uguale alla stringa di partenza, copiare ogni singolo carattere giusto e poi creare la stringa passandogli l'array
 
ragazzi sono riuscito a risolvere grazie a tutti per l'aiuto posto il codice se dovesse servire a qualcuno:
Codice:
#include <iostream>
#include <string>
using namespace std;

char confronto = '&';
string input;
int n;

int main() {

cout <<"inserire la stringa: " <<endl;
getline(cin, input);
cout <<"la stringa che hai inseriro è: " <<input <<endl;

n=input.length();

for (int i=0; i<n; i++)
{

    if (input[i] == confronto)
        {
            i = i+1;
            while (input[i] != confronto)
                {
                    i=i+1;
                }//fine while

            i=i+2; //serve ad eliminare l'ultimo carattere speciale ed il secondo spazio

        }//fine if

    cout <<input[i];


}//fine for



}//fine main
 
Ciao, mi sono permesso di fare qualche modifica al tuo codice (non all'algoritmo). Non si tratta di una "correzione", dato che il codice funziona alla perfezione, piuttosto di un consiglio. Per prima cosa ho spostato le dichiarazioni delle variabili che erano fuori dal main dentro, perché è meglio evitare di usare variabili globali. Poi ho apportato qualche cambiamento minore, come l'uso del carattere \n per andare a capo invece di endl (meno efficiente) e il qualificatore const per rendere la variabile confronto una costante. Ecco qui:
C:
#include <iostream>
#include <string>

int main()
{
    using namespace std;
    const char confronto = '&';
    string input;
     
    cout << "inserire la stringa: \n";
    getline(cin, input);
    cout << "la stringa che hai inserito e': \n" << input << "\n";
 
    for (int i = 0; i < input.length(); ++i) {
        if (input[i] == confronto) {
            i += 1;
            while (input[i] != confronto) {
                i += 1;
            }
            i += 2; //serve ad eliminare l'ultimo carattere speciale ed il secondo spazio
        }
        cout << input[i];
    }

    return 0;
}

In questa versione, invece, uso un oggetto iterator per scandire la stringa anziché una variabile contatore tradizionale. Uso le funzioni begin() e end() per trovare l'inizio e la fine della stringa.
Da notare che per riferirmi all'i-esimo carattere della stringa scrivo *i, cioè uso l'operatore di dereferenziazione, perché l'oggetto iterator è sostanzialmente un puntatore.
C:
#include <iostream>
#include <string>

int main()
{
    using namespace std;
    const char confronto = '&';
    string input;
     
    cout << "inserire la stringa: \n";
    getline(cin, input);
    cout << "la stringa che hai inserito e': \n" << input << "\n";
 
    // uso un iterator per scandire la stringa
    for (string::iterator i = input.begin(); i < input.end(); ++i) {
        if (*i == confronto) {
            i += 1;
            while (*i != confronto) {
                i += 1;
            }
            i += 2; //serve ad eliminare l'ultimo carattere speciale ed il secondo spazio
        }
        cout << *i;
    }

    return 0;
}
 
Ultima modifica:
Ciao, mi sono permesso di fare qualche modifica al tuo codice (non all'algoritmo). Non si tratta di una "correzione", dato che il codice funziona alla perfezione, piuttosto di un consiglio. Per prima cosa ho spostato le dichiarazioni delle variabili che erano fuori dal main dentro, perché è meglio evitare di usare variabili globali. Poi ho apportato qualche cambiamento minore, come l'uso del carattere \n per andare a capo invece di endl (meno efficiente) e il qualificatore const per rendere la variabile confronto una costante. Ecco qui:
C:
#include <iostream>
#include <string>

int main()
{
    using namespace std;
    const char confronto = '&';
    string input;
     
    cout << "inserire la stringa: \n";
    getline(cin, input);
    cout << "la stringa che hai inserito e': \n" << input << "\n";
 
    for (int i = 0; i < input.length(); ++i) {
        if (input[i] == confronto) {
            i += 1;
            while (input[i] != confronto) {
                i += 1;
            }
            i += 2; //serve ad eliminare l'ultimo carattere speciale ed il secondo spazio
        }
        cout << input[i];
    }

    return 0;
}

In questa versione, invece, uso un oggetto iterator per scandire la stringa anziché una variabile contatore tradizionale. Uso le funzioni begin() e end() per trovare l'inizio e la fine della stringa.
Da notare che per riferirmi all'i-esimo carattere della stringa scrivo *i, cioè uso l'operatore di dereferenziazione, perché l'oggetto iterator è sostanzialmente un puntatore.
C:
#include <iostream>
#include <string>

int main()
{
    using namespace std;
    const char confronto = '&';
    string input;
     
    cout << "inserire la stringa: \n";
    getline(cin, input);
    cout << "la stringa che hai inserito e': \n" << input << "\n";
 
    // uso un iterator per scandire la stringa
    for (string::iterator i = input.begin(); i != input.end(); ++i) {
        if (*i == confronto) {
            i += 1;
            while (*i != confronto) {
                i += 1;
            }
            i += 2; //serve ad eliminare l'ultimo carattere speciale ed il secondo spazio
        }
        cout << *i;
    }

    return 0;
}

Ciao fabio93 grazie del consiglio che sicuramente sono molto utili vorrei solo capire meglio cosa è e come si utilizza l’interator
Grazie in anticipo
 
Ciao, un iterator è un oggetto che ti permette di scandire gli elementi di un array o stringa. Il vantaggio è che funziona su tutti gli standard container come list, vector, ecc. Lo svantaggio nel caso del tuo programma è che forse è meno efficiente, perché fa due chiamate alle funzioni begin() e end(), mentre con un semplice contatore bastava chiamare la funzione length(). Più che altro te l'ho fatto vedere per curiosità. Non sono molto esperto di c++ perché non l'ho ancora studiato, quindi mi scuso se ho fatto qualche imprecisione. Guarda qui per l'uso delle stringhe in c++: http://www.yolinux.com/TUTORIALS/LinuxTutorialC++StringClass.html
 
Ciao, un iterator è un oggetto che ti permette di scandire gli elementi di un array o stringa. Il vantaggio è che funziona su tutti gli standard container come list, vector, ecc. Lo svantaggio nel caso del tuo programma è che forse è meno efficiente, perché fa due chiamate alle funzioni begin() e end(), mentre con un semplice contatore bastava chiamare la funzione length(). Più che altro te l'ho fatto vedere per curiosità. Non sono molto esperto di c++ perché non l'ho ancora studiato, quindi mi scuso se ho fatto qualche imprecisione. Guarda qui per l'uso delle stringhe in c++: http://www.yolinux.com/TUTORIALS/LinuxTutorialC++StringClass.html
Interessante strumento, cercherò di informarmi meglio grazie del consiglio.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top