2009-10-13 11 views
8

Próbuję przekonwertować LPCSTR na liczbę całkowitą za pomocą atoi(), i w celu sprawdzenia, czy konwersja się powiodła Chcę policzyć liczbę cyfr w liczbie całkowitej, którą wyprodukował i oryginalny LPCSTR (powinien zawierać tylko liczby całkowite)Jak znaleźć długość LPCSTR

Mam trudności ze znalezieniem dobrego sposobu na obliczenie długości LPCSTR. Do tej pory jedynym sposobem wydaje się być po prostu liczenie, aż dojdę do "/ 0"

Wszelkie sugestie dotyczące lepszej metody?

Dzięki

Odpowiedz

11

Czy to nie to, co robi strlen?

+0

Doh! Przepraszam chłopaki, pierdnięcie mózgu. Musiał mieć jakąś mentalną blokadę, żeby nie pamiętać tego i nigdy go nie widziałem w żadnym z moich poszukiwań –

+3

lstrlen() to ... –

2

Nie.

W ten sposób znajdziesz długość łańcucha c. Możesz użyć strlen, ale nadal musisz przejść cały ciąg znaków i policzyć liczbę znaków przed '\0'.

8

Można użyć strtol i użyć zwróconego endptr, aby sprawdzić, czy jest to koniec ciągu (0 bajt).

Liczenie niekoniecznie będzie dokładne. "00" spowoduje 0, ale 0 ma jedną cyfrę, a oryginalny ciąg ma długość 2.

5

Funkcja, której szukasz, to strlen().

wykorzystanie próbki:

size_t len = strlen(szNumber); 
2

Dyskusja na temat wytwarzania więcej ciepła niż światła ... :) Przestań używać atoi „” i że będzie rozwiązać większość problemów. "atoi" jest martwą funkcją bez wartości praktycznej. Właściwym sposobem przekształcenia reprezentacji ciągów na liczbę jest funkcja z grupy "strto ..." ("strtol", "strtoul" itp.). Te funkcje zwrócą ci wystarczającą ilość informacji, aby od razu określić, czy wystąpił błąd konwersji, czy też nie.

0

zrobiłbym rzeczy trochę inaczej - zainicjować stringstream z wejściem, przeczytaj int, a następnie sprawdzić, czy strumień jest pusta:

#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; 
} 

Inną możliwością byłoby rozsądne strtol lub jeden z jego kuzyni. Zwracają one wskaźnik do pierwszej nieskonwertowanej postaci (jeśli istnieje), więc informują o tym bezpośrednio, co było i nie zostało przekształcone. Są szybsze, ale generalnie mniej elastyczne niż strumienie - na przykład, jeśli chcesz odczytać liczbę zmiennoprzecinkową, parametr check_read powyżej będzie działał tak, jak jest, ale coś, co używa strtol, musiałoby zostać przepisane.

Jeszcze jedna możliwość, możesz rozważyć Boost leksykalny_pakiet (który jest nieco inny, ale całkiem podobny do powyższego kodu).

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

Aby znaleźć długość (w tym przypadku liczbę cyfr) danego LPCTSTR, należy używać lstrlen() a nie strlen(). Źródło: MSDN

0

Od LPCSTR jest po prostu const char* (po usunięciu makr), strlen będzie w porządku.

Jeśli jednak używasz funkcji okna jawnie zdefiniowanej jako odpowiadającej wejściu LPCSTR, możesz użyć lstrlenA. Poważnie wątpię, że istnieje jakakolwiek praktyczna różnica wywołująca to i nazywająca się strlen.

Powiązane problemy