2010-10-04 21 views
7

Hola Sé que me lo preguntaron muchas veces pero no encontré respuesta a mi pregunta específica.convertir cadena a entero en C++

que desea convertir sólo cadena que contiene sólo números decimales:

Por ejemplo 256 está bien, pero no es 256a.

¿Se puede hacer sin verificar la cadena?

Gracias

+2

Su línea de asunto dice "convertir entero en cadena", pero su tipo de pregunta parece implicar una conversión de cadena a cadena ... ¿qué intenta hacer? – EboMike

+1

Esta publicación es vaga y necesita más puntuación. ¿Podrías explicar a qué te refieres con un ejemplo? – JoshD

Respuesta

14

la manera más simple que hace la comprobación de errores opcional que se me ocurre es la siguiente:

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

¿qué tal 'atoi'? – Alcott

+1

No soy fan de 'atoi' ya que no proporciona ninguna forma de diferenciar entre una cadena completamente no válida y una cadena que es válida y se convierte en' 0' –

7

En C manera ++, utilizan 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

, pero ¿y si la cadena no es un número entero? ¿Cuál será el valor de 'a'? –

+0

@ Jean-FrançoisFabre: Puede verificar la condición de transmisión verificando el estado devuelto por 'sstr.rdstate()', o verificando los valores de estado individuales. He actualizado mi respuesta con la última opción. – Donotalo

6

Otra manera usando estilo C++: verificamos el número de dígitos para saber si la cadena fue válida o no:

#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

Falla para "0", "0001", "-5". – stark