Errore di C ++ conversione di una stringa in un doppio
Domanda
Sto cercando di convertire una stringa in una doppia. Il codice è molto semplice.
double first, second;
first=atof(str_quan.c_str());
second=atof(extra[i+1].c_str());
cout<<first<<" "<<second<<endl;
quantity=first/second;
quando si cerca di convertire in più, il compilatore genera questo gioiello di saggezza a me:
errore: richiesta di c_str membro in extra.std :: basic_string <_CharT, _Traits, _Alloc> :: operator [] [con _CharT = char, _Traits = std :: char_traits, _Alloc = std :: allocator] (((unsigned int) (i + 1))), che è non-classe tipo char
Non ho idea di cosa significhi. se io cout in più [i + 1], ottengo 3. Se lascio extra come una stringa, il programma tenta di div prima (2) del 51 (ascii per 3). Che diamine sta succedendo?
Soluzione
Sembra extra
è un std::string
, così extra[i+1]
restituisce un char
, che è di tipo non-class.
Sembra che si sta tentando di analizzare la extra
stringa a partire dalla posizione di i+1
th. È possibile farlo utilizzando:
second = atof(extra.substr(i + 1).c_str());
Altri suggerimenti
Sulla base del messaggio di errore, extra
è di tipo std::string
. Quando si esegue extra[i+1]
, il risultato è di tipo char
e contiene il carattere della stringa extra
at posizione i+1
.
Non Probabilmente quello desiderato.
Come una correzione, sostituire extra[i+1]
con una nuova stringa, come segue:
extra2 = extra.substr(i+1);
// ...
second=atof(extra2.c_str());
Un modo migliore per gestire questa conversione (che è meno soggetto a errori) è usare stringstreams:
stringstream ss(str_quan);
double first;
ss >> first;
Non hai detto, ma penso che "extra" è di tipo std :: string. Così l'espressione "in più [i + 1] è il carattere "i + 1" di "extra", che sembra essere '3'.
Che cosa stai in realtà cercando di fare?
Se si desidera solo caratteri i + 1 fino alla fine di "extra" (e si sa per quanto tempo supplementare è), si desidera qualcosa di simile:
second = atof(extra.c_str() + i + 1);
Quando si chiede aiuto è spesso reallyt usfull per fornire un esempio compilabile.
La mia ipotesi (e mi immagino enfasi becuase non c'è abbastanza informazioni sul tipo o numeri di linea).
second=atof(extra[i+1].c_str());
// Guess
// extra is std::string.
Così in più [x] restituisce un char che non ha un metodo c_str ()