Así que busqué a mi alrededor cómo convertir una cadena en un corto y encontré mucho sobre cómo convertir una cadena en un número entero. Dejaría una pregunta como comentario sobre esos hilos, pero no tengo suficiente reputación. Entonces, lo que quiero hacer es convertir una cadena en un corto, porque el número nunca debe ir por encima de tres o por debajo de cero y los cortos ahorran memoria (que yo sepa).

Para ser claros, no me refiero a los códigos ASCII.

Otra cosa que quiero poder hacer es verificar si la conversión de la cadena al corto falla, porque usaré una cadena que consiste en una entrada de usuario.

Sé que puedo hacer esto con un bucle while, pero si hay una función incorporada para hacer esto en C ++ que sería igual o más eficiente que un bucle while, me encantaría saberlo.

10
Logan Kling 13 feb. 2015 a las 06:42

3 respuestas

La mejor respuesta

el número nunca debe ser superior a tres ni inferior a cero

Si realmente necesitas ahorrar memoria, esto también cabrá en un char (independientemente de si char está firmado o no).

Otro truco 'extremo': si puedes confiar en que no hay cosas raras como "002", entonces lo que tienes es una cadena de un solo carácter. Si ese es el caso, y realmente necesita rendimiento, intente:

char result = (char)( *ptr_c_string - '0' );
1
Bert Bril 13 feb. 2015 a las 08:34

También puede utilizar ssprintf con el especificador de formato %hi.

Ejemplo:

short port;
char szPort[] = "80";

sscanf(szPort, "%hi", &port);
3
John Doe 2 nov. 2017 a las 06:02

Una forma eficaz es utilizar {{X0 }}:

short myShort = boost::lexical_cast<short>(myString);

Deberá instalar biblioteca de impulso y lo siguiente incluye: #include <boost/lexical_cast.hpp>

Deberías atrapar a bad_lexical_cast en caso de que el lanzamiento falle:

    try
    {
        short myShort = boost::lexical_cast<short>(myString);
    }
    catch(bad_lexical_cast &)
    {
        // Do something
    }
4
Jérôme 13 feb. 2015 a las 04:09