2016-08-29 4 views
1

У меня есть функция isnumber() в моем ctype.h. Я не нахожу ссылки на эту функцию в книгах, которые у меня нет ни в http://www.cplusplus.com/reference/cctype/ для справки. Я намереваюсь обнаружить и показать разницу между isdigit() и isnumber() простым примером, но нет (кроме того, U + 0C6A, U + 0ED2 и ½ не определяются функциями). Есть ли разница? Как я могу это разрешить?В чем разница между isdigit() и 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; 
} 

Часть результата:

... 

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

Какой это компилятор, и на какой машине? – gpvos

ответ

3

isdigit() работает только с 0-9.

isnumber() допускает другие значения чисел, такие как фракции. Некоторые символы, которые являются «числовыми», но не цифрами, включают 0x00b2 и 0x00b3, которые являются надстрочными 2 и 3 («²» и «³») и глифами, которые представляют собой фракции, такие как «¼», «½» и «¾».

+3

Откуда появляется 'isnumber()'? Я не могу найти его в стандарт .. – songyuanyao

+0

@songyuanyao __DARWIN_CTYPE_TOP_inline INT ISNUMBER (интермедиат _c) { \t возвращение (__istype (_c, _CTYPE_D)); } ctype.h – Isi

+3

@ Isi Кажется, что это нестандартная функция, может быть обеспечена реализацией или платформой. Я просто хочу, кто его предоставляет, или источник цитируемой информации. – songyuanyao

4

isnumber() может быть специфичным для Apple методом C++ (у меня нет проверки Mac на проверку). Вы можете увидеть его в Apple dev guide:

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


Кроме того, isnumber() не заявлен на Linux: Я использую г ++ 6.1.1 на Linux 4.7.2 и получить ошибку:

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)) { 
       ^

Я также использую clang3.8.1 для теста:

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

Компилятор Apple LLVM версии 7.3.0 (clang-703.0.31). Посмотрите на мой coment @ songyuanyao – Isi

+0

@Toby Speight, спасибо. –

1

isnumber() была добавлена ​​Apple, поэтому вам нужно использовать документацию Apple.

Просим обратить внимание на предложения от the ctype.h manpage for iOS& dagger;:

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

На той же странице фактически не ссылается на страницы руководства для isnumber(), но я экстраполировать его URL из ссылки на страницы руководство для стандартных функций, и нашел this:

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

& dagger; Результат №4 в Google для isnumber ctype & hellip;