isdigit()c ++,可能是简单的问题,但卡住了

时间:2010-06-03 23:49:34

标签: c++

我在使用isdigit时遇到了麻烦。我阅读了文档,但是当我cout<< isdigit(9),我得到0.我不应该得到1吗?

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

3 个答案:

答案 0 :(得分: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)

,结果将是相同的。

答案 1 :(得分:5)

isdigit()需要int,这是角色的代表。字符9是(假设您使用的是ASCII) TAB 字符。字符0x39或'9'( 9)是表示数字9的实际字符。

数字字符是ASCII中的整数代码0x30到0x39(或48到57) - 我重申,因为ASCII不是ISO C标准的要求。因此,以下代码:

if ((c >= 0x30) && (c <= 0x39))
我之前见过的

对于可移植性来说不是一个好主意,因为至少有一个实现使用EBCDIC - isdigit是所有情况下的最佳选择。

答案 2 :(得分:0)

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