Esercizio sui puntatori
Si considerino stringhe definite secondo il seguente formato
dove
Scrivere una funzione che riceve in ingresso un puntatore a una stringa costruita secondo questo formato, e restituisce come risultato due stringhe corrispondenti rispettivamente, alle sottostringhe x...x e y...y della stringa ricevuta in ingresso. Scrivere anche un codice pilota che consenta di verificare la correttezza della funzione
"&...&x...x&...&y...y&...&"
dove
&...&è una sequenza di due o più caratteri
&
x...x e y...ysono sequenze di uno o più caratteri, tutti diversi dal carattere
&
Scrivere una funzione che riceve in ingresso un puntatore a una stringa costruita secondo questo formato, e restituisce come risultato due stringhe corrispondenti rispettivamente, alle sottostringhe x...x e y...y della stringa ricevuta in ingresso. Scrivere anche un codice pilota che consenta di verificare la correttezza della funzione
Risposte
Non capisco la domanda!
Nemmeno io... visto che la domanda non c'è.

maschulillo puoi spiegare meglio cosa ti serve?
ah scusate mancava un pezzo dell'esercizio
ecco l'ho aggiunto
ecco l'ho aggiunto
Che cosa non riesci a fare? Inizia a scrivere una tua versione. Ho l'impressione che tu non faccia in generale abbastanza sforzi per capire come risolvere questi esercizi e non vedo da un esercizio all'altro molti progressi.
#include<iostream> #include<string> using namespace std; string funzione(char*); int main() { char* s="&&&xx&&yyyy&&"; cout<<funzione(s); return 0; } string funzione(char* s) { string p=s; int l=p.length(); int array[l-1]; int indx=0; // for(int i=0;i<l;i++) // { // if(p.substr(i,1)=="&") // array[indx]=i; // indx++; // } for(int i=0;i<l;i++) { if(p.substr(i,1)=="x") array[indx]=i; indx++; } int a[l-1]; int indice=0; for(int j=0;j<l;j++) { if(p.substr(j,1)=="y") a[indice]=j; indice++; } return p.substr(array[0],array[l-1]); return p.substr(a[0],a[l-1]); } io ho fatto così mi dà un solo errore nella conversione da char a stringa
Una funzione non può restituire due valori, per cui non è quello il modo corretto di restituire i valori. Hai principalmente le seguenti scelte:
1. Creare una struttura contenente due stringhe e che sarà il tuo valore di ritorno.
2. Restituire un array di stringhe.
3. Passare due puntatori a stringhe come argomento e modificare il loro valore all'interno della funzione in modo che puntino alle stringhe da restituire.
4. Passare due stringhe come argomento e scrivere su quelle.
5. Passare un array di stringhe e scrivere su quello.
C'è poi un po' di confusione sul termine "stringa" nel testo. Tu l'hai infatti interpretato prima come una stringa del C e poi come la classe string del C++. Personalmente sarei tentato ad usare un'interpretazione più uniforme (tutto char*). Anche perché credo che sia importante capire come gestire le stringhe senza far ricorso alla classe std::string*. Classe std::string che non stai usando per niente bene comunque, la seguente espressione:
avrebbe infatti dovuto essere
Personalmente, avrei scritto la funzione con uno dei seguenti prototipi:
oppure
in cui nella prima lasciavo l'allocazione delle stringhe al chiamante mentre nel secondo caso l'allocazione verrebbe fatta all'interno della funzione.
* Si tratta anche di una domanda che mi sembra essere abbastanza diffusa nei colloqui di lavoro.
1. Creare una struttura contenente due stringhe e che sarà il tuo valore di ritorno.
2. Restituire un array di stringhe.
3. Passare due puntatori a stringhe come argomento e modificare il loro valore all'interno della funzione in modo che puntino alle stringhe da restituire.
4. Passare due stringhe come argomento e scrivere su quelle.
5. Passare un array di stringhe e scrivere su quello.
C'è poi un po' di confusione sul termine "stringa" nel testo. Tu l'hai infatti interpretato prima come una stringa del C e poi come la classe string del C++. Personalmente sarei tentato ad usare un'interpretazione più uniforme (tutto char*). Anche perché credo che sia importante capire come gestire le stringhe senza far ricorso alla classe std::string*. Classe std::string che non stai usando per niente bene comunque, la seguente espressione:
p.substr(i,1)=="&"
avrebbe infatti dovuto essere
p[i] == '&'
Personalmente, avrei scritto la funzione con uno dei seguenti prototipi:
void funzione(char *, char *, char *);
oppure
char **funzione(char *)
in cui nella prima lasciavo l'allocazione delle stringhe al chiamante mentre nel secondo caso l'allocazione verrebbe fatta all'interno della funzione.
* Si tratta anche di una domanda che mi sembra essere abbastanza diffusa nei colloqui di lavoro.
devo per forza creare una struttura?
perchè quando mi è stato assegnato l'esercizio non mi è stato detto di usarle visto che noi le abbiamo solo accennate le strutture
non c'è un altro modo che mi potresti farmi vedere sotto forma di codice?
perchè quando mi è stato assegnato l'esercizio non mi è stato detto di usarle visto che noi le abbiamo solo accennate le strutture
non c'è un altro modo che mi potresti farmi vedere sotto forma di codice?
La struttura è solo uno dei tanti modi in cui puoi farlo come ti ho già spiegato nel mio ultimo post che ti consiglio di rileggerti perché credo che tu non l'abbia per niente compreso. Ti ho anche mostrato due possibili prototipi che non fanno uso di strutture.
ora ci provo e domani ti posto come l'ho fatto io
grazie mille
grazie mille
scusa io ci sto provando a farlo solo con i char ma non ci riesco proprio
come faccio a scorrere i singoli caratteri dei char e a conoscere la sua lunghezza
ma come l'ho scritta io perchè non va bene la conversione da char a string?
eppure l'ho letta sul libro di testo
come faccio a scorrere i singoli caratteri dei char e a conoscere la sua lunghezza
ma come l'ho scritta io perchè non va bene la conversione da char a string?
eppure l'ho letta sul libro di testo
Ma che errore ti da la costruzione della stringa in quel modo? Dovrebbe essere possibile farlo. Comunque trattandosi di un esercizio sui puntatori e sulle stringhe del C, imparare a "a scorrere i singoli caratteri dei char e a conoscere la sua lunghezza" è importante.
Esistono per prima cosa delle funzioni che permettono di semplificare la gestione delle stringhe in C. Queste funzioni sono contenute nell'header (string.h se si lavora in C). Per conoscere la lunghezza di una stringa è per esempio sufficiente usare strlen, ma credo che sia istruttivo per ora evitare di farne uso in modo da imparare meglio come lavorare sulle stringhe.
Una stringa in C è una successione di caratteri (char) che termina con '\0' (detto terminatore di stringa). La stringa "Ciao" corrisponde quindi a {'C', 'i', 'a', 'o', '\0'}. Il puntatore che utilizzi per fare riferimento a questa stringa è semplicemente il puntatore al primo carattere della stringa. Per conoscere la lunghezza della stringa è quindi sufficiente avanzare con il puntatore fino a raggiungere il carattere '\0'. Questo è in effetti esattamente quello che fa strlen.In effetti puoi provare a sostituire l'esempio nel link sopra con il seguente (scritto sul momento):
Era possibile anche scriverlo in modo più sintetico e probabilmente il tuo compilatore la implementa in assembly, ma l'idea è più o meno quella.
Nell'esempio che ti ho scritto (e nella pagina che ti ho linkato prima) c'è anche un'altra cosa di cui è importante discutere. Una stringa come "Ciao" è allocata staticamente della lunghezza giusta nel tuo programma e non puoi modificarla. Ma se devi creare una nuova stringa è necessario allocare la memoria in qualche modo. Puoi farlo o allocando un array come nell'esempio sopra oppure allocare dinamicamente la memoria con new char[N] e deallocandola con delete[] (o altro). Questa è solo una brevissima e incompleta panoramica, ti consiglio quindi di leggere il tuo manuale del C++ (qual'è tralaltro?).
Esistono per prima cosa delle funzioni che permettono di semplificare la gestione delle stringhe in C. Queste funzioni sono contenute nell'header
Una stringa in C è una successione di caratteri (char) che termina con '\0' (detto terminatore di stringa). La stringa "Ciao" corrisponde quindi a {'C', 'i', 'a', 'o', '\0'}. Il puntatore che utilizzi per fare riferimento a questa stringa è semplicemente il puntatore al primo carattere della stringa. Per conoscere la lunghezza della stringa è quindi sufficiente avanzare con il puntatore fino a raggiungere il carattere '\0'. Questo è in effetti esattamente quello che fa strlen.In effetti puoi provare a sostituire l'esempio nel link sopra con il seguente (scritto sul momento):
#include <cstdio> using namespace std; unsigned my_strlen(const char *str) { unsigned result = 0; while (*str != '\0') { ++result; ++str; } return result; } int main() { char input[256]; fputs("Enter a sentence: ", stdout); fgets(input, 256, stdin); // gets è il demonio printf("The sentence entered is %u characters long.\n", my_strlen(input)); return 0; }
Era possibile anche scriverlo in modo più sintetico e probabilmente il tuo compilatore la implementa in assembly, ma l'idea è più o meno quella.
Nell'esempio che ti ho scritto (e nella pagina che ti ho linkato prima) c'è anche un'altra cosa di cui è importante discutere. Una stringa come "Ciao" è allocata staticamente della lunghezza giusta nel tuo programma e non puoi modificarla. Ma se devi creare una nuova stringa è necessario allocare la memoria in qualche modo. Puoi farlo o allocando un array come nell'esempio sopra oppure allocare dinamicamente la memoria con new char[N] e deallocandola con delete[] (o altro). Questa è solo una brevissima e incompleta panoramica, ti consiglio quindi di leggere il tuo manuale del C++ (qual'è tralaltro?).
io ci sto provando e provando ma trovo problemi sempre nella conversione
ho riletto nuovamente il libro ed è come l'avevo fatto io
tutte le funzioni che tu mi hai scritto io non le ho studiate(o meglio non ci sono state dette dal professore)
comunque ecco quello che sono riuscito a fare
vorrei sapere il puntatore *char punta al primo caratttere della stringa, come si fa ad accedere ai successivi, perchè così mi dà errore e sul libro non c'è scritto
ho riletto nuovamente il libro ed è come l'avevo fatto io
tutte le funzioni che tu mi hai scritto io non le ho studiate(o meglio non ci sono state dette dal professore)
comunque ecco quello che sono riuscito a fare
vorrei sapere il puntatore *char punta al primo caratttere della stringa, come si fa ad accedere ai successivi, perchè così mi dà errore e sul libro non c'è scritto
#include<iostream> #include<string> using namespace std; void funzione(char*); int main() { char* p="&&&xxx&&yy&&&&"; funzione(p); return 0; } void funzione(char* p) { int lunghezza=0; while(*p!='\0') { ++lunghezza; ++ p; } int l=lunghezza; for(int i=0;i<l;i++) { int lfirst; if(*(p+i)=="x") lfirst++; for(int j=0;j<lfirst;j++) cout<<*(p+j); int llast; if(*(p+i)=="y") llast++; for (int j=0;j<llast;j++) cout<<*(p+j); } }
@apatriarca
allora hai capito come si può risolvere?
puoi aiutarmi?
questo esercizio è abbastanza importante per me
aspetto tue notizie
allora hai capito come si può risolvere?
puoi aiutarmi?
questo esercizio è abbastanza importante per me
aspetto tue notizie
Sono stato occupato in questo weekend e non ho avuto tempo di risponderti. Ma del codice che hai scritto c'è ben poco di corretto. Ma se non hai fatto queste cose, forse vuole effettivamente che tu faccia uso di std::string. In cosa consiste esattamente il programma del tuo corso?
Nelle tue discussioni c'è spesso confusione tra funzioni che restituiscono valori e quelle che invece li stampano e basta. Nel testo si parla infatti esplicitamente di restituire le due stringhe, ma nel tuo ultimo tentativo hai invece cercato di stamparle.
Nelle tue discussioni c'è spesso confusione tra funzioni che restituiscono valori e quelle che invece li stampano e basta. Nel testo si parla infatti esplicitamente di restituire le due stringhe, ma nel tuo ultimo tentativo hai invece cercato di stamparle.
infatti ho sbagliato ma proprio non so come fare
io ho studiato le stringhe e tra le funzioni membro della libreria solamente il getline , length, e il substr
il char mi è stato accennato
infatti nella prima versione del codice avevo provato a convertirle come tra l'altro c'era scritto nel libro ma mi dava errore
come posso fare per risolvere l'esercizio?
io ho studiato le stringhe e tra le funzioni membro della libreria
il char mi è stato accennato
infatti nella prima versione del codice avevo provato a convertirle come tra l'altro c'era scritto nel libro ma mi dava errore
come posso fare per risolvere l'esercizio?
Andiamo un po' per ordine:
1. Preferisci che la soluzione utilizzi std::string, char * o tutti i due come nel tuo primo tentativo?
2. Preferisci restituire i valori definendo in modo opportuno il valore di ritorno (per esempio restituendo un array di stringhe o un std::pair) oppure utilizzare i parametri anche per restituire i valori?
Detto questo alcuni commenti sul codice e sull'algoritmo da te proposti nei tuoi tentativi:
1. Array e puntatori sono in molti casi interscambiabili, se hai quindi un puntatore puoi ad esempio usare le parentesi graffe invece dell'aritmetica dei puntatori. Cioè, *(p + i) è equivalente a p.
2. x...x e y...y non sono successioni di x o y, ma delle stringhe qualsiasi che non contengono &. Per cui NON devi fare confronti con 'x' e 'y' come fai in entrambi i codici da te proposti. L'unico carattere che devi verificare è &.
Ma in realtà non c'è molto di corretto nel codice che hai scritto, direi niente.
Il tuo codice dovrà più o meno seguire la seguente logica:
1. Trovare il primo carattere della stringa diverso da &. Copiare la sottostringa che parte da questo carattere e termina al primo carattere & trovato (escludendo questo carattere dalla stringa).
2. Trovare il primo carattere della stringa diverso da & dopo la fine della sottostringa precedente. Da questo carattere parte la seconda sottostringa da copiare, che terminerà con un altro carattere &.
A questo punto ti potresti fermare a meno di voler verificare che la stringa rispetti la specifica ed è allora necessario arrivare fino alla fine della stringa e verificare che il numero di & sia rispettato (devono essercene sempre almeno 2) e che gli unici caratteri diversi da & siano disposti in due sottostringhe non contenenti &.
1. Preferisci che la soluzione utilizzi std::string, char * o tutti i due come nel tuo primo tentativo?
2. Preferisci restituire i valori definendo in modo opportuno il valore di ritorno (per esempio restituendo un array di stringhe o un std::pair) oppure utilizzare i parametri anche per restituire i valori?
Detto questo alcuni commenti sul codice e sull'algoritmo da te proposti nei tuoi tentativi:
1. Array e puntatori sono in molti casi interscambiabili, se hai quindi un puntatore puoi ad esempio usare le parentesi graffe invece dell'aritmetica dei puntatori. Cioè, *(p + i) è equivalente a p.
2. x...x e y...y non sono successioni di x o y, ma delle stringhe qualsiasi che non contengono &. Per cui NON devi fare confronti con 'x' e 'y' come fai in entrambi i codici da te proposti. L'unico carattere che devi verificare è &.
Ma in realtà non c'è molto di corretto nel codice che hai scritto, direi niente.
Il tuo codice dovrà più o meno seguire la seguente logica:
1. Trovare il primo carattere della stringa diverso da &. Copiare la sottostringa che parte da questo carattere e termina al primo carattere & trovato (escludendo questo carattere dalla stringa).
2. Trovare il primo carattere della stringa diverso da & dopo la fine della sottostringa precedente. Da questo carattere parte la seconda sottostringa da copiare, che terminerà con un altro carattere &.
A questo punto ti potresti fermare a meno di voler verificare che la stringa rispetti la specifica ed è allora necessario arrivare fino alla fine della stringa e verificare che il numero di & sia rispettato (devono essercene sempre almeno 2) e che gli unici caratteri diversi da & siano disposti in due sottostringhe non contenenti &.
preferisco utilizzare solo le string
Allora avrai qualcosa come
oppure
oppure
oppure
oppure
oppure
oppure ... Come vuoi restituire queste stringhe insomma?
pair<string, string> funzione(const string &);
oppure
vector<string> & funzione(const string &);
oppure
string * funzione(const string &);
oppure
void funzione(const string &, string **);
oppure
void funzione(const string &, string &, string &);
oppure
void funzione(const string &, vector<string> &);
oppure ... Come vuoi restituire queste stringhe insomma?
penso di aver trovato una soluzione
ora ci ragiono e poi vi faccio sapere
ora ci ragiono e poi vi faccio sapere