当输入£和¬时,isdigit引发调试断言

时间:2015-01-21 21:31:53

标签: c++ validation input

以下代码适用于我输入的每个字符,但£¬除外。

为什么我的"调试断言失败"?

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() {
    string input;
    while (1) {
        cout << "Input number: ";
        getline(cin, input);
        if (!isdigit(input[0]))
            cout << "not a digit\n";
    }
}

2 个答案:

答案 0 :(得分:3)

The microsoft docs say

  

C ++编译器将char,signed char和unsigned char类型的变量视为具有不同类型。 除非使用/ J编译选项,否则将char类型的变量提升为int,就好像它们是默认类型为signed的字符一样。在这种情况下,它们被视为unsigned char类型,并且在没有符号扩展名的情况下被提升为int。

And they also say

  

如果isdigit不是_isdigit_l或者cEOF范围内,00xFF的行为未定义,包容性。当使用调试CRT库并且c不是这些值之一时,函数会引发断言

因此char默认为signed,这意味着由于这两个字符不是ASCII,因此它们在ANSI字符集中为负数,因此您可以获得断言。

答案 1 :(得分:2)

The Microsoft docs说:

  

如果c不是EOF或者在0到0xFF范围内(包括0和0xFF),则isdigit和_isdigit_l的行为是未定义的。当使用调试CRT库并且c不是这些值之一时,函数会引发一个断言。

(我猜测微软是因为关于“错误窗口”的评论,但是其他实现的文档对参数值设置了相同的限制。)

编辑:正如Deduplicator观察到的那样,错误可能源于在此平台上签署的默认char,因此您传递的是负值(与EOF不同)。 std::string使用char,而非宽字符,因此我的原始结论不正确。