DOMANDA [C++] Domanda su getline & Comprendere le documentazioni

Pubblicità

Xpovos

Utente Attivo
Messaggi
294
Reazioni
4
Punteggio
38
[C++] Vettore non accetta costante

Il codice è questo: https://ideone.com/JHQB1E

Il problema a quanto pare è che il vettore non accetta le costanti.
Oltre alla possibile soluzione (cercando di rimanere se possibile con la costante), mi dareste dei consigli su come "migliorare" il codice?

Vecchie domande:
Grazie a tutti, la mia intenzione era quella di ricreare una funzione simile a setw perché mi sembrava una cosa apparentemente semplice. Ad ogni modo, qualcuno potrebbe spiegarmi o magari indirizzarmi a qualche documento che spieghi come si facciano a comprendere i documenti ufficiali (per fare un esempio: string - C++ Reference ), particolarmente questo tipo di scritture:

[TABLE="width: 0"]
[TR="class: even"]
[TH="align: right"]default (1)[/TH]
[TD]string();[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]copy (2)[/TH]
[TD]string (const string& str);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]substring (3)[/TH]
[TD]string (const string& str, size_t pos, size_t len = npos);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]from c-string (4)[/TH]
[TD]string (const char* s);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]from buffer (5)[/TH]
[TD]string (const char* s, size_t n);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]fill (6)[/TH]
[TD]string (size_t n, char c);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]range (7)[/TH]
[TD]template <class InputIterator>
string (InputIterator first, InputIterator last);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]initializer list (8)[/TH]
[TD]string (initializer_list<char> il);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]move (9)[/TH]
[TD]string (string&& str) noexcept;[/TD]
[/TR]
[/TABLE]

Cioè tutte queste parole "costanti" che usano i documenti per spiegare le funzioni, inclusa quella "e" commerciale nella seconda riga..

Domanda 2
Dando un occhiata alle stringhe provavo il getline :

Codice:
char delim = '5';
    getline(std::cin, frase,delim);
    std::cout << frase;
Il programma non finisce di richiedere un input, a meno che non inserisca dei numeri equivalenti al delim-1. Allora mi stampa tutto ciò che ho scritto, mi sembra anomalo, se tolgo il campo del delimitatore ovviamente fila tutto liscio. E quel -1 è per il carattere finale nullo? Non era solo nei vettori di caratteri (stringhe nel C) ?


Vecchie domande
Il codice è questo:

Codice:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>




using namespace std;


void spazio(int numero){


    for (int i = 1; i <= numero; i++){
        cout << " ";
            }


}




int main()
{


    cout << "ciao" [FONT=arial black][B][COLOR=#ff0000]<<[/COLOR][/B][/FONT] spazio(5) << "ciao2";


    system("PAUSE");
    return 0;
}

L'errore è evidenziato in rosso e recita:
Codice:
error C2679: '<<' binario: non è stato trovato alcun operatore che accetti un operando destro di tipo 'void'. È anche possibile che non vi siano conversioni accettabili.

Come faccio a risolvere? Cioè oltre a staccare il cout dalla funzione, come posso fare in modo che la funzione ritorni un certo numero di spazi? Ho messo il tipo di funzione in string e ho provato ad inserire il ciclo for nel return ma non me lo accetta.
 
Ultima modifica:
Re: Richiamare una funzione in Cout

Ciao. Proprio come dice l' errore, non ci sono operatori che accettino il tipo 'void'. Semplicemente non puoi stampare una funzione. Per risolvere è molto semplice. Sposta il richiamo alla funzione 'spazio' fuori da cout come nell' esempio :

Codice:
cout << "ciao";
spazio(5);
cout << "ciao2";
 
Re: Richiamare una funzione in Cout

Grazie a tutti, la mia intenzione era quella di ricreare una funzione simile a setw perché mi sembrava una cosa apparentemente semplice. Ad ogni modo, qualcuno potrebbe spiegarmi o magari indirizzarmi a qualche documento che spieghi come si faccio a comprendere i documenti ufficiali (per fare un esempio: string - C++ Reference ), particolarmente questo tipo di scritture:

[TABLE="width: 0"]
[TR="class: even"]
[TH="align: right"]default (1)[/TH]
[TD]string();[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]copy (2)[/TH]
[TD]string (const string& str);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]substring (3)[/TH]
[TD]string (const string& str, size_t pos, size_t len = npos);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]from c-string (4)[/TH]
[TD]string (const char* s);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]from buffer (5)[/TH]
[TD]string (const char* s, size_t n);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]fill (6)[/TH]
[TD]string (size_t n, char c);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]range (7)[/TH]
[TD]template <class InputIterator>
string (InputIterator first, InputIterator last);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]initializer list (8)[/TH]
[TD]string (initializer_list<char> il);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]move (9)[/TH]
[TD]string (string&& str) noexcept;[/TD]
[/TR]
[/TABLE]

Cioè tutte queste parole "costanti" che usano i documenti per spiegare le funzioni, inclusa quella e commerciale nella seconda riga.. alcuni sono spiegati sotto


Domanda 2
Dando un occhiata alle stringhe provavo il getline :

Codice:
char delim = '5';
    getline(std::cin, frase,delim);
    std::cout << frase;
Il programma non finisce di richiedere un input, a meno che non inserisca dei numeri equivalenti al delim-1. Allora mi stampa tutto ciò che ho scritto, mi sembra anomalo, se tolgo il campo del delimitatore ovviamente fila tutto liscio. E quel -1 è per il carattere finale nullo? Non era solo nei vettori di caratteri (stringhe nel C) ?
 
Ultima modifica:
Re: Richiamare una funzione in Cout

Grazie a tutti, la mia intenzione era quella di ricreare una funzione simile a setw perché mi sembrava una cosa apparentemente semplice. Ad ogni modo, qualcuno potrebbe spiegarmi o magari indirizzarmi a qualche documento che spieghi come si faccio a comprendere i documenti ufficiali (per fare un esempio: string - C++ Reference ), particolarmente questo tipo di scritture:

[TABLE="width: 0"]
[TR="class: even"]
[TH="align: right"]default (1)[/TH]
[TD]string();[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]copy (2)[/TH]
[TD]string (const string& str);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]substring (3)[/TH]
[TD]string (const string& str, size_t pos, size_t len = npos);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]from c-string (4)[/TH]
[TD]string (const char* s);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]from buffer (5)[/TH]
[TD]string (const char* s, size_t n);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]fill (6)[/TH]
[TD]string (size_t n, char c);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]range (7)[/TH]
[TD]template <class InputIterator>
string (InputIterator first, InputIterator last);[/TD]
[/TR]
[TR="class: odd"]
[TH="align: right"]initializer list (8)[/TH]
[TD]string (initializer_list<char> il);[/TD]
[/TR]
[TR="class: even"]
[TH="align: right"]move (9)[/TH]
[TD]string (string&& str) noexcept;[/TD]
[/TR]
[/TABLE]

Cioè tutte queste parole "costanti" che usano i documenti per spiegare le funzioni, inclusa quella e commerciale nella seconda riga.. alcuni sono spiegati sotto
Eh?
Domanda 2
Dando un occhiata alle stringhe provavo il getline :

Codice:
char delim = '5';
    getline(std::cin, frase,delim);
    std::cout << frase;
Il programma non finisce di richiedere un input, a meno che non inserisca dei numeri equivalenti al delim-1. Allora mi stampa tutto ciò che ho scritto, mi sembra anomalo, se tolgo il campo del delimitatore ovviamente fila tutto liscio. E quel -1 è per il carattere finale nullo? Non era solo nei vettori di caratteri (stringhe nel C) ?
Eh? Quale -1? E le tue affermazioni non hanno senso...

Ma rileggi quello che scrivi?
 
Re: Richiamare una funzione in Cout

Eh?

Eh? Quale -1? E le tue affermazioni non hanno senso...

Ma rileggi quello che scrivi?

La prima parte del post è abbastanza chiara, sto chiedendo aiuto su come riuscire a comprendere bene le documentazioni del C++, in particolare quelle parole presenti nelle tabelle come "const string&, size_t, (InputIterator first, InputIterator last)" e altre che sembrano essere delle frasi "esempio", inoltre vorrei capire cosa significa precisamente "Member Types", "Member Function" e "non-member function", su questi ultimi due mi sto esercitando.
Per fare un esempio, andando nella scheda (constructor) di Member function vedo diversi modi di dichiarare e inizializzare una stringa, la prima riga della tabella descrive come si possa inizializzare una stringa vuota. Il problema è che se copio-incollo string(); oppure string stringa(); VS mi dà errore. Allora esiste un interpretazione che non conosco di quella tabella, come faccio io a comprenderla? Ecco cosa chiedevo.

La seconda parte del post è descritta altrettanto chiaramente anche solo dal codice che ho postato, il problema è che la console mi chiede di inserire qualcosa, perché giustamente ho messo un getline, ma non si ferma di richiedere l'input a meno che io non scriva dei 'n' numeri quanti ne ho indicati nel delimitatore (-1 perché è così, se inserisco 3 numeri mi ferma l'input e passa al cout, il delimitatore è a 4), Questa cosa ovviamente non succede se tolgo il "delim" che da quanto ho capito dovrebbe limitare il numero di caratteri inseriti nellì'input e scartare quelli successivi.

Pur non essendomi spiegato molto bene avresti potuto in qualche modo capirmi, sono solo un newbie che cerca di impare qualcosa, non c'è bisogno di rispondere in questo modo.
 
Re: Richiamare una funzione in Cout

std::string è un typedef di una specializzazione della classe template basic_string. Se non sai cosa significhi, non credo tu possa capire a fondo cosa sia e come funzioni (implementazione).
Quelli che hai mostrato nella prima domanda sono i costruttori di std::string. Chiaramente per interpretare l'interfaccia di std::string devi sapere cosa sia una funzione membro, una classe, un costruttore ecc.

getline non legge n caratteri, bensì fino ad n. È scritto chiaramente:
Extracts characters from is and stores them into str until the delimitation character delim is found (or the newline character, '\n', for (2)).
Guarda qua https://ideone.com/AZQgvZ
 
Re: Richiamare una funzione in Cout

std::string è un typedef di una specializzazione della classe template basic_string. Se non sai cosa significhi, non credo tu possa capire a fondo cosa sia e come funzioni (implementazione).
Quelli che hai mostrato nella prima domanda sono i costruttori di std::string. Chiaramente per interpretare l'interfaccia di std::string devi sapere cosa sia una funzione membro, una classe, un costruttore ecc.

getline non legge n caratteri, bensì fino ad n. È scritto chiaramente:

Guarda qua https://ideone.com/AZQgvZ
Non so cosa significhi typedef e non ho ancora letto nulla sulle classi ma dato che mi avevi consigliato string(n, ' '); ho pensato di leggermi un po' di tutto sulle stringhe e diciamo che sono riuscito a capire tutte le inizializzazioni tranne l'ultima (
range (7)) che capirò in futuro, spero. Grazie per il getline, io e l'inglese non andiamo molto d'accordo...
 
Te lo spiego brevemente: in C++ è molto comune utilizzare i range(="campo"), che va da ... a.
Esempio:
Codice:
vector<int> vettore{10, 25, 5, -1, 99, -20};
sort( vettore.begin(), vettore.end() );
Come puoi leggere, dico a std::sort di lavorare dall'inizio alla fine di "vettore". Vale lo stesso per std::string
Codice:
char array[] = {"Hello World!"};
string s( begin(array), end(array) );
Anziché utilizzare il "vecchio" stile C, ossia passare un puntatore insieme al numero di elementi
Codice:
string s( array, sizeof(array) );
 
Te lo spiego brevemente: in C++ è molto comune utilizzare i range(="campo"), che va da ... a.
Esempio:
Codice:
vector<int> vettore{10, 25, 5, -1, 99, -20};
sort( vettore.begin(), vettore.end() );
Come puoi leggere, dico a std::sort di lavorare dall'inizio alla fine di "vettore". Vale lo stesso per std::string
Codice:
char array[] = {"Hello World!"};
string s( begin(array), end(array) );
Anziché utilizzare il "vecchio" stile C, ossia passare un puntatore insieme al numero di elementi
Codice:
string s( array, sizeof(array) );

Sono codici che non riesco a comprendere attualmente, cioè mi manca proprio la sintassi base di alcune parti, spero di riuscire a capirle in futuro. Comunque cercherò di imparare le basi delle funzione membro, delle classi e dei costruttori se sono indispensabili per comprendere questi documenti.
 
Sono codici che non riesco a comprendere attualmente, cioè mi manca proprio la sintassi base di alcune parti, spero di riuscire a capirle in futuro. Comunque cercherò di imparare le basi delle funzione membro, delle classi e dei costruttori se sono indispensabili per comprendere questi documenti.
Quelli sono elementi chiave della OOP (Object Oriented Programming). Focalizzati su quella per poi, se vuoi, passare alla programmazione generica (che è abbastanza complessa, ma estremamente potente).
 
Il codice è questo: https://ideone.com/JHQB1E

Il problema a quanto pare è che il vettore non accetta le costanti.
Oltre alla possibile soluzione (cercando di rimanere se possibile con la costante), mi dareste dei consigli su come "migliorare" il codice?
@signore del tempo
 
Ti propongo la mia versione: https://ideone.com/qd80Cj
Usando la libreria standard (vector, string) ho semplificato di molto il codice, rendendolo lineare e moderno.
L'input termina quando max == 0 oppure inserisci EOF (CTRL + D Unix - CTRL + Z Windows), che invaliderebbe l'input. Infatti, nel while, eseguo (cin>> tmp) ​che controlla lo stato dello stream dopo l'operazione: se fallisse, l'espressione risulterebbe false. (ios::operator bool - C++ Reference)
 
Ti propongo la mia versione: https://ideone.com/qd80Cj
Usando la libreria standard (vector, string) ho semplificato di molto il codice, rendendolo lineare e moderno.
L'input termina quando max == 0 oppure inserisci EOF (CTRL + D Unix - CTRL + Z Windows), che invaliderebbe l'input. Infatti, nel while, eseguo (cin>> tmp) ​che controlla lo stato dello stream dopo l'operazione: se fallisse, l'espressione risulterebbe false. (ios::operator bool - C++ Reference)

Ti propongo la mia versione: https://ideone.com/qd80Cj
Usando la libreria standard (vector, string) ho semplificato di molto il codice, rendendolo lineare e moderno.
L'input termina quando max == 0 oppure inserisci EOF (CTRL + D Unix - CTRL + Z Windows), che invaliderebbe l'input. Infatti, nel while, eseguo (cin>> tmp) ​che controlla lo stato dello stream dopo l'operazione: se fallisse, l'espressione risulterebbe false. (ios::operator bool - C++ Reference)

Grazie per la risposta, non conoscevo la libreria vector e ho scoperto il tipo "auto" che è veramente molto comodo ma sconsigliato al programmatore da quanto dicono le ricerche, inoltre lo "stile" del codice che non conoscevo, cioè il fatto che tu abbia messo un "cin >> tmp" nelle condizioni del while inizialmente mi ha confuso, poi non sono ancora riuscito a capire cos'è che rende falsa la condizione, ho solo notato che la variabile "max" arriva a -1 e (conseguentemente?) il ciclo si ferma...
Poi nei vettori, ".size" indica il numero di elementi occupati mentre ".capacity" tutto l'insieme degli elementi giusto?
Un altra cosa che non mi è chiara è il ciclo for finale:


for (const auto &i : vettore)

cout << "- " << i << "\n";



dichiari una costante di tipo auto (esiste un modo per vedere il tipo che assegna il compilatore in automatico?) che andando a tentativi mi sembra che sia sempre vector<string> giusto?
Poi inizializzi direttamente il suo indirizzo rendendolo uguale a quello di vettore? Non capisco la funzione del ":" in quel punto lì...
 
Pubblicità
Pubblicità
Indietro
Top