2009-10-13 7 views
8

Je suis en train de convertir un LPCSTR en un entier en utilisant atoi(), et pour vérifier que la conversion s'est bien déroulée, je veux compter le nombre de chiffres dans l'entier produit et le LPCSTR d'origine (il ne doit contenir que des entiers)Comment trouver la longueur d'un LPCSTR

J'ai du mal à trouver un bon moyen de calculer la longueur du LPCSTR. Jusqu'à présent, la seule manière semble être de compter jusqu'à ce que j'arrive à un '/ 0'

Des suggestions pour une meilleure méthode?

Merci

Répondre

11

N'est-ce pas ce que strlen fait?

+0

Doh! Désolé les gars, péter le cerveau. Doit avoir eu une sorte de bloc mental pour ne pas se souvenir de celui-ci et ne jamais le voir sur aucune de mes recherches –

+3

lstrlen() c'est ... –

2

. Non

C'est ainsi que vous trouvez la longueur d'un c-string. Vous pouvez utiliser strlen, mais il doit encore descendre toute la chaîne et compter le nombre de caractères avant un '\0'.

8

Vous pouvez utiliser strtol et utiliser le endptr retourné pour vérifier si c'est la fin de la chaîne (0 octet).

Le comptage ne sera pas nécessairement précis. "00" donnera 0, mais 0 a un chiffre et la chaîne d'origine a la longueur 2.

5

La fonction strlen() est ce que vous cherchez.

Exemple d'utilisation:

size_t len = strlen(szNumber); 
2

Discuter de produire plus de chaleur que de lumière ... :) Arrêtez d'utiliser « atoi » et qui permettra de résoudre la plupart de vos problèmes. 'atoi' est une fonction morte sans valeur pratique. La bonne façon de convertir une représentation de chaîne en un nombre est des fonctions du groupe 'strto ...' ('strtol', 'strtoul' etc.). Ces fonctions vous renverront suffisamment d'informations pour déterminer immédiatement si une erreur de conversion s'est produite ou non.

0

Je ferais les choses un peu différemment - initialiser un stringstream avec l'entrée, lire un int, puis vérifiez si le flux est vide:

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

Une autre possibilité raisonnable serait strtol ou un de ses les cousins. Ceux-ci renvoient un pointeur vers le premier caractère non converti (le cas échéant), de sorte qu'ils vous disent assez directement ce qui a été et n'a pas été converti. Ils sont plus rapides mais généralement moins flexibles que les flux - par exemple, si vous voulez lire un nombre à virgule flottante, le check_read ci-dessus fonctionnera tel quel, mais quelque chose utilisant strtol devra être réécrit.

Comme encore une possibilité de plus, vous pourriez envisager Boost lexical_cast (qui est empaqueté un peu différemment, mais assez similaire au code ci-dessus).

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

Pour trouver la longueur (dans ce cas, le nombre de chiffres) d'un LPCTSTR, vous devez utiliser lstrlen() et non strlen(). Source: MSDN

0

Depuis LPCSTR est juste const char* (après dés-macro), strlen ira bien.

Toutefois, si vous recherchez une fonction Windows explicitement définie pour correspondre à l'entrée LPCSTR, vous pouvez utiliser lstrlenA. Je doute sérieusement qu'il y ait une différence pratique appelant cela et appelant strlen cependant.

Questions connexes