2010-06-03 67 views
7

我遇到了isdigit问题。我读了文档,但是当我输出数字(9)时,我得到一个0.我不应该得到1吗?isdigit()C++,可能是简单的问题,但卡住了

#include <iostream> 
#include <cctype> 
#include "Point.h" 

int main() 
{ 
    std::cout << isdigit(9) << isdigit(1.2) << isdigit('c'); 
    // create <int>i and <double>j Points 
    Point<int> i(5, 4); 
    Point<double> *j = new Point<double> (5.2, 3.3); 

    // display i and j 
    std::cout << "Point i (5, 4): " << i << '\n'; 
    std::cout << "Point j (5.2, 3.3): " << *j << '\n'; 

    // Note: need to use explicit declaration for classes 
    Point<int> k; 
    std::cout << "Enter Point data (e.g. number, enter, number, enter): " << '\n' 
     << "If data is valid for point, will print out new point. If not, will not " 
     << "print out anything."; 
    std::cin >> k; 
    std::cout << k; 

    delete j; 
} 

回答

16

isdigit()是用于测试的字符是否是一个数字字符。

如果您将其称为isdigit('9'),它将返回非零值。

在ASCII字符集(您可能使用的)中,9代表水平制表符,它不是数字。


由于您使用的I/O流的输入,就不需要使用isdigit()验证输入。如果从流中读取的数据无效,则提取(即std::cin >> k)将失败,因此如果您期望读取int并且用户输入“asdf”,则提取将失败。

如果提取失败,则会设置流上的失败位。您可以测试,这和处理错误:

std::cin >> k; 
if (std::cin) 
{ 
    // extraction succeeded; use the k 
} 
else 
{ 
    // extraction failed; do error handling 
} 

注意,提取本身也返回流,这样就可以缩短前两行是简单的:

if (std::cin >> k) 

和结果是相同的。

+0

并不意味着要窃取你的答案。我正在关闭Google,并没有看到回复。 – 2010-06-03 23:52:43

+1

'isdigit',而不是'isDigit';) – tzaman 2010-06-03 23:53:16

+0

那么,如何验证userInput,因为我需要单引号在parantheses? – Crystal 2010-06-03 23:54:18

0

isdigit()适用于当前正在传递的字符,而不是ascii值。尝试使用isdigit('9')

+0

函数是'isdigit'(小写'd'),可以说isdigit'可以很好地处理ASCII值。 – dreamlax 2010-06-04 00:46:13

+0

修正了这个问题。它在ASCII上工作得很好,但是你必须知道你使用的是ASCII而不是传递一个字符。我认为他试图测试'9'而不是'TAB' – 2010-06-04 01:01:55

5

isdigit()需要int这是字符的表示。字符9是(假设你使用ASCII)TAB字符。字符0x39或“9”( 9)是表示数字9

的数字字符是整数代码0x30至在ASCII 0x39(或48至57)的实际的字符 - I重申的是,由于ASCII是不ISO C标准的要求。因此,下面的代码:

if ((c >= 0x30) && (c <= 0x39)) 

这我以前见过,不具有通用性的好主意,因为存在使用EBCDIC在幕后的至少一个实现 - isdigit是在所有情况下的最佳选择。

+1

+1,注意到正确的函数签名,证明了'char'和'int'的互换性。 – 2010-06-03 23:57:04

+3

然而,标准确实要求数字的字符值必须是从0到9的顺序。因此,'if((c> ='0')&&(c <='9'))'将起作用。对于字母字符,*不是*真。 – dreamlax 2010-06-04 00:54:47

+0

IIRC'isdigit('1')'也可以返回true - char也可以是ASCI的超集。 – MSalters 2010-06-04 08:28:21