2016-08-29 3 views
1

J'ai la fonction isnumber() dans mon ctype.h. Je ne trouve pas de références de cette fonction dans les livres que je n'ai pas dans http://www.cplusplus.com/reference/cctype/ pour consulter. Je l'intention de détecter et montrer la différence entre isdigit() et ISNUMBER() par un exemple simple, mais il n'y a pas (d'ailleurs, U + 0C6A, U + 0ED2 et ½ sont indétectables par les fonctions). Y a-t-il une différence? Comment pourrais-je résoudre cela?Quelle est la différence entre isdigit() et isnumber()?

int main(int, char *[]) 
{ 
    string text("Hello½123, Poly౪ ໒girl0.5!!!"); 
    decltype(text.size()) punct = 0, alpha = 0, number = 0, space = 0, digit = 0, graf = 0; 
    for(auto i : text) { 
     if(ispunct(i)){ 
      cout << i << "<punct "; 
      ++punct; 
     } 
     if(isalpha(i)) { 
      cout << i << "<alpha "; 
      ++alpha; 
     } 
     if(isnumber(i)) { 
      cout << i << "<number "; 
      ++number; 
     } 
     if(isdigit(i)) { 
      cout << i << "<digit "; 
      ++digit; 
     } 
     if(isgraph(i)) { 
      cout << i << "<graph "; 
      ++graf; 
     } 
     if(isspace(i)) 
      ++space; 
    } 
    cout << endl << "There is " << endl; 
    cout << punct << " puncts," << endl; 
    cout << alpha << " alphas," << endl; 
    cout << number << " numbers," << endl; 
    cout << digit << " digits," << endl; 
    cout << graf << " graphs," << endl; 
    cout << space << " spaces" << endl; 
    cout << "in " << text << endl; 

    return 0; 
} 

Une partie du résultat:

... 

5 numbers, 
5 digits, 
23 graphs, 
2 spaces 
in Hello½123, Poly౪ ໒girl0.5!!! 
+1

compilateur est que, et sur quel type de machine? – gpvos

Répondre

3

isdigit() ne fonctionne qu'avec 0-9.

isnumber() permet d'autres valeurs numériques telles que des fractions. Certains caractères qui sont 'numériques' mais non numériques comprennent 0x00b2 et 0x00b3 qui sont en exposant 2 et 3 ('²' et '³') et les glyphes qui sont des fractions telles que '¼', '½' et '¾'.

+3

D'où provient 'isnumber()'? Je ne le trouve pas dans la norme .. – songyuanyao

+0

@songyuanyao __DARWIN_CTYPE_TOP_inline int isnumber (int _c) { \t return (__istype (_c, _CTYPE_D)); } de ctype.h – Isi

+3

@Isi Il semble que ce soit une fonction non-standard, qui peut être fournie par l'implémentation ou la plate-forme. Je veux juste qui le fournir, ou la source de l'information citée. – songyuanyao

4

isnumber() peut être une méthode Apple spécifique C++ (je n'ai pas Mac à portée de main pour vérifier). Vous pouvez le voir dans le Apple dev guide:

The isnumber() function behaves similarly to isdigit() , but may recognize additional characters, depending on the current locale setting.


Par ailleurs, isnumber() n'est pas déclaré sur Linux: J'utilise g ++ 6.1.1 sur Linux 4.7.2 et obtenir l'erreur:

g++ a.cpp 
a.cpp: In function 'int main(int, char**)': 
a.cpp:20:17: error: 'isnumber' was not declared in this scope 
    if (isnumber(i)) { 
       ^

J'utilise aussi clang3.8.1 à tester:

clang++ a.cpp --std=c++11 
a.cpp:20:7: error: use of undeclared identifier 'isnumber' 
       if (isnumber(i)) { 
        ^
+0

Le compilateur est Apple LLVM version 7.3.0 (clang-703.0.31). Regardez mon commentaire @ songyuanyao – Isi

+0

@Toby Speight, merci. –

1

Le La fonction isnumber() a été ajoutée par Apple, vous devez donc utiliser la documentation Apple.

Voici une citation de the ctype.h manpage for iOS& poignard;:

STANDARDS 
    These functions, except for digittoint(), isascii(), ishexnumber(), 
    isideogram(), isnumber(), isphonogram(), isrune(), isspecial() and 
    toascii(), conform to ISO/IEC 9899:1990 (``ISO C90''). 

La même page ne lie pas vraiment à un page de manuel isnumber(), mais j'extrapolé son URL des liens vers les pages de manuel pour les fonctions standard et trouvé this:

The isnumber() function behaves similarly to isdigit(), but may recognize 
additional characters, depending on the current locale setting. 

& dagger; Résultat 4 sur Google pour isnumber ctype & hellip;