2009-10-13 9 views
8

Estoy tratando de convertir un LPCSTR a un número entero usando atoi(), y para verificar que la conversión se haya realizado correctamente, deseo contar el número de dígitos en el entero que produjo y el LPCSTR original (no debe contener nada más que números enteros)Cómo encontrar la longitud de un LPCSTR

Tengo dificultades para encontrar una buena forma de calcular la longitud del LPCSTR. Hasta ahora, la única forma parece ser solo contar hasta que llegue a un '0'

¿Alguna sugerencia para un mejor método?

Gracias

Respuesta

11

¿No es eso lo que strlen hace?

+0

Doh! Lo siento chicos, pedo cerebro. Debe haber tenido algún tipo de bloqueo mental para no recordar este y nunca verlo en ninguna de mis búsquedas –

+3

lstrlen() es ... –

2

Nope.

Así es como se encuentra la longitud de una cuerda. Puede usar strlen, pero aún tiene que bajar toda la cadena y contar el número de caracteres antes de '\0'.

8

Puede usar strtol y usar endptr para comprobar si es el final de la cadena (0 byte).

El recuento no será necesariamente exacto. "00" dará como resultado 0, pero 0 tiene un dígito y la cadena original tiene longitud 2.

5

La función strlen() es lo que está buscando.

Ejemplo de uso:

size_t len = strlen(szNumber); 
2

Hablar de producir más calor que luz ... :) Deje de usar 'atoi' y que va a resolver la mayoría de sus problemas. 'atoi' es una función muerta sin valor práctico. La forma correcta de convertir una representación de cadena a un número son funciones del grupo 'strto ...' ('strtol', 'strtoul', etc.). Estas funciones le regresarán información suficiente para determinar de inmediato si se produjo un error de conversión o no.

0

me gustaría hacer las cosas un poco diferente - Iniciar una stringstream con la entrada, leer un int, a continuación, comprobar si la secuencia está vacía:

#include <sstream> 
#include <iostream> 

typedef char const *LPCSTR; 

template <class T> 
bool check_read(LPCSTR input, T &val) { 
    std::istringstream reader(input); 

    reader >> val; 
    char ch; 
    if (reader >> ch) { 
     std::cerr << "\nUnconverted character: " << ch << std::endl; 
     return false; 
    } 
    return true; 
} 

int main() { 
    LPCSTR inputs[] = {"12345", "54321a"}; 
    int a; 

    for (int i=0; i<2; i++) { 
     check_read(inputs[i], a); 
     std::cout << "Converted: " << a << std::endl; 
    } 
    return 0; 
} 

Otra posibilidad sería razonable strtol o uno de sus primos. Estos devuelven un puntero al primer carácter no convertido (si lo hay), por lo que le informan de manera bastante directa qué fue y qué no se convirtió. Son más rápidos, pero en general son menos flexibles que las transmisiones; por ejemplo, si desea leer un número de punto flotante, el check_read anterior funcionará como está, pero algo que use strtol debería ser reescrito.

Como una posibilidad más, puede considerar Boost lexical_cast (que está empaquetado de forma un poco diferente, pero bastante similar al código anterior).

1
LPCSTR lpText = "test"; 
long lTextLen = CString(lpText).GetLength(); 
14

para encontrar la longitud (en este caso, el número de dígitos) de un LPCTSTR, usted debe utilizar lstrlen() y no strlen(). Fuente: MSDN

0

Dado que LPCSTR es solo const char* (después de la desgrabación), strlen estará bien.

Sin embargo, si busca una función de Windows explícitamente definida para corresponder con la entrada LPCSTR, entonces podría usar lstrlenA. Dudo seriamente que haya alguna diferencia práctica llamando a esto y llamando al strlen.

Cuestiones relacionadas