RISOLTO Programmino C++ con le stringhe

Stato
Discussione chiusa ad ulteriori risposte.

marco42

Nuovo Utente
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
223
Hardware Utente
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
Hard Disk
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
Scheda Video
rx 480 8gb reference
Monitor
TV HD 32"
Alimentatore
cx750m corsair
Case
cooler master mastercase 5
Sistema Operativo
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
Reactions: marco42

Lugio

Utente Attivo
845
223
Hardware Utente
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
Hard Disk
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
Scheda Video
rx 480 8gb reference
Monitor
TV HD 32"
Alimentatore
cx750m corsair
Case
cooler master mastercase 5
Sistema Operativo
windows 10 64bit
  • Mi piace
Reactions: marco42

rodhellas

Utente Attivo
1,467
394
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
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
Reactions: marco42

Lugio

Utente Attivo
845
223
Hardware Utente
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
Hard Disk
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
Scheda Video
rx 480 8gb reference
Monitor
TV HD 32"
Alimentatore
cx750m corsair
Case
cooler master mastercase 5
Sistema Operativo
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
Reactions: marco42

marco42

Nuovo Utente
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 Attivo
1,467
394
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
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
Reactions: marco42

marco42

Nuovo Utente
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
419
116
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
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
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
419
116
Hardware Utente
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
Hard Disk
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
Alimentatore
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Logitech G203
Sistema Operativo
Windows 10 Pro, Ubuntu 19.04
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
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
Reactions: fabio93
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando