2010-10-04 24 views
7

Ciao So che è stato chiesto molte volte ma non ho trovato risposta alla mia domanda specifica.converti stringa in intero in C++

voglio convertire solo stringa che contiene solo numeri decimali:

Per esempio 256 è OK, ma non è 256a.

Potrebbe essere eseguito senza controllare la stringa?

Grazie

+2

La riga dell'oggetto dice "converti intero in stringa", ma il tipo di domanda sembra implicare una conversione da stringa a int ... cosa stai cercando di fare ?! – EboMike

+1

Questo post è vago e ha bisogno di più segni di punteggiatura. Potresti spiegare cosa intendi con un esempio? – JoshD

risposta

14

Il modo più semplice che rende il controllo degli errori opzionale che mi viene in mente è questa:

char *endptr; 
int x = strtol(str, &endptr, 0); 
int error = (*endptr != '\0'); 
+0

che dire di 'atoi'? – Alcott

+1

Non sono un fan di 'atoi' poiché non fornisce alcun modo di dire la differenza tra una stringa completamente non valida e una stringa che è valida e converte in' 0' –

7

In C modo ++, utilizzare stringstream:

#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

int main() 
{ 
    stringstream sstr; 
    int a = -1; 

    sstr << 256 << 'a'; 
    sstr >> a; 

    if (sstr.failbit) 
    { 
     cout << "Either no character was extracted, or the character can't represent a proper value." << endl; 
    } 
    if (sstr.badbit) 
    { 
     cout << "Error on stream.\n"; 
    } 

    cout << "Extracted number " << a << endl; 

    return 0; 
} 
+0

ma cosa succede se la stringa non è un intero? quale sarà il valore di 'a'? –

+0

@ Jean-FrançoisFabre: è possibile verificare la condizione di flusso verificando lo stato restituito da 'sstr.rdstate()', oppure controllando i singoli valori di stato. Ho aggiornato la mia risposta con quest'ultima scelta. – Donotalo

6

Un altro modo utilizzando stile C++: controlliamo il numero di cifre per sapere se la stringa era valida o meno:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <cmath> 

int main(int argc,char* argv[]) { 

    std::string a("256"); 

    std::istringstream buffer(a); 
    int number; 
    buffer >> number; // OK conversion is done ! 
    // Let's now check if the string was valid ! 
    // Quick way to compute number of digits 
    size_t num_of_digits = (size_t)floor(log10(abs(number))) + 1; 
    if (num_of_digits!=a.length()) { 
     std::cout << "Not a valid string !" << std::endl; 
    } 
    else { 
     std::cout << "Valid conversion to " << number << std::endl; 
    } 

} 
+0

Errore per "0", "0001", "-5". – stark