我使用Visual Studio 2010编译了代码,然后我尝试运行它,不幸的是在测试期间有时候我有错误“Debug Assertion Failed!”....表达式(未加工)(c + 1)&lt ; = 256
然后我尝试了相同的场景但是使用gcc并且它运行没有任何问题。知道这个问题怎么样?
答案 0 :(得分:5)
您正在调用isalpha()或isdigit()之类的函数,其整数的值不是单字节0-255。
答案 1 :(得分:3)
有一段代码说“此时,我们希望表达式(unsigned)(c + 1) <= 256
为真;如果不是,请在此时停止执行并进入调试器”。
进入调试器的方法取决于平台,可能无法正确实现gcc。我会在项目中查找这段代码,然后尝试找出为什么c
应该小于或等于255,以及是什么使它超出范围;让程序运行到触发断言的位置会给出错误条件的隐含断点,从那开始。
答案 2 :(得分:2)
我发现问题的原因是每个编译器如何声明字符。在Visual Studio中,默认值为Signed char。因此,除非您使用无符号字明确地在其声明之前,否则每个字符都会被签名。因此在VS中,字符的范围是-128到127,如果读取的char具有大于128的ASCII,则它在VS中将具有负代码。由于这种情况不在函数isalpha,isdigit等处理,因此函数将失败。 在gcc中,将char设置为sign或unsigned的使用方法类似于动态预处理器。
答案 3 :(得分:1)
对于RowData
函数的意外输入,您已成为未定义行为的受害者。根据{{3}}:
在所有情况下,参数都是
<ctype.h>
,其值应表示为int
或等于宏unsigned char
的值。如果参数具有任何其他值,则行为未定义。
换句话说,如果EOF
不在x
或[0..UCHAR_MAX]
的范围内,则不得将其传递给任何EOF
函数。被抛出的断言是一种相当有礼貌的方式,让你知道你违反了这条规则;大多数人只会让可怕的事情发生(例如,我可以想象出心脏的错误)。