以下代码适用于我输入的每个字符,但£
或¬
除外。
为什么我的"调试断言失败"?
#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";
}
}
答案 0 :(得分:3)
C ++编译器将char,signed char和unsigned char类型的变量视为具有不同类型。 除非使用/ J编译选项,否则将char类型的变量提升为int,就好像它们是默认类型为signed的字符一样。在这种情况下,它们被视为unsigned char类型,并且在没有符号扩展名的情况下被提升为int。
如果
isdigit
不是_isdigit_l
或者c
到EOF
范围内,0
和0xFF
的行为未定义,包容性。当使用调试CRT库并且c
不是这些值之一时,函数会引发断言。
因此char
默认为signed
,这意味着由于这两个字符不是ASCII,因此它们在ANSI字符集中为负数,因此您可以获得断言。
答案 1 :(得分:2)
如果c不是EOF或者在0到0xFF范围内(包括0和0xFF),则isdigit和_isdigit_l的行为是未定义的。当使用调试CRT库并且c不是这些值之一时,函数会引发一个断言。
(我猜测微软是因为关于“错误窗口”的评论,但是其他实现的文档对参数值设置了相同的限制。)
编辑:正如Deduplicator观察到的那样,错误可能源于在此平台上签署的默认char
,因此您传递的是负值(与EOF
不同)。 std::string
使用char
,而非宽字符,因此我的原始结论不正确。