RISOLTO Programmino C++ con le stringhe

Stato
Discussione chiusa ad ulteriori risposte.

marco42

Nuovo Utente
55
5
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:

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
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.
 
  • Mi piace
Reazioni: marco42

marco42

Nuovo Utente
55
5
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 ??
 

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
  • Mi piace
Reazioni: marco42

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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 @.
 
  • Mi piace
Reazioni: marco42

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
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
 
  • Mi piace
Reazioni: marco42

marco42

Nuovo Utente
55
5
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
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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
 
  • Mi piace
Reazioni: marco42

marco42

Nuovo Utente
55
5
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
 

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
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:

marco42

Nuovo Utente
55
5
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
 

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
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
 

marco42

Nuovo Utente
55
5
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.
 
  • Mi piace
Reazioni: fabio93
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!