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

Cry*_*tal 7 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;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 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
}
Run Code Online (Sandbox Code Playgroud)

请注意,提取本身也会返回流,因此您可以简单地缩短前两行:

if (std::cin >> k)
Run Code Online (Sandbox Code Playgroud)

结果将是相同的.


pax*_*blo 5

isdigit()取一个int是角色的代表.字符9是(假设您使用的是ASCII)TAB字符.字符0x39或'9'(不是 9)是表示数字9的实际字符.

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

if ((c >= 0x30) && (c <= 0x39))
Run Code Online (Sandbox Code Playgroud)

我之前见过的,对于可移植性来说不是一个好主意,因为至少有一个实现使用EBCDIC - isdigit在所有情况下都是最好的选择.

  • 然而,标准确实要求数字的字符值必须从0到9连续.因此,`if((c> ='0')&&(c <='9'))`将起作用.对于字母字符,同样是*not*true. (3认同)