我在使用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;
}
答案 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')
。