Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 visualc&x2B+&引用;“调试断言失败”;_Visual Studio 2010_Visual C++ - Fatal编程技术网

Visual studio 2010 visualc&x2B+&引用;“调试断言失败”;

Visual studio 2010 visualc&x2B+&引用;“调试断言失败”;,visual-studio-2010,visual-c++,Visual Studio 2010,Visual C++,我使用Visual Studio 2010编译了一段代码,然后我尝试运行它,不幸的是,在测试过程中有时会出现错误“调试断言失败!”…表达式(未Singned)(c+1)有一段代码说“在这一点上,我们希望表达式(未签名)(c+1)您正在调用类似isalpha()或isdigit()的函数使用一个值不是单字节0-255的整数。我发现问题的原因是每个编译器如何声明字符。在Visual Studio中,默认值是有符号字符。因此,除非在声明之前显式使用无符号字,否则每个字符都有符号。因此,在VS中,字符的

我使用Visual Studio 2010编译了一段代码,然后我尝试运行它,不幸的是,在测试过程中有时会出现错误“调试断言失败!”…表达式(未Singned)(c+1)有一段代码说“在这一点上,我们希望表达式
(未签名)(c+1)您正在调用类似isalpha()或isdigit()的函数使用一个值不是单字节0-255的整数。

我发现问题的原因是每个编译器如何声明字符。在Visual Studio中,默认值是有符号字符。因此,除非在声明之前显式使用无符号字,否则每个字符都有符号。因此,在VS中,字符的范围是-128到127,如果ar的ASCII值大于128,它在VS中将有一个负代码,并且由于此情况未在isalpha、isdigit等函数中处理。该函数将失败。
在gcc中,用于将字符设置为有符号或无符号的方法类似于动态预处理器。

对于函数的意外输入,您已成为未定义行为的受害者。根据:

在所有情况下,参数都是
int
,其值应表示为
无符号字符
,或应等于宏
EOF
的值。如果参数有任何其他值,则行为未定义


换句话说,如果
x
不在
[0..UCHAR\u MAX]
EOF
的范围内,则不得将其传递给任何
函数。抛出断言是一种相当礼貌的方式,可以让您知道您违反了此规则;大多数人只会让可怕的事情发生(例如,我可以想象令人心痛的bug).

可以是任何东西-实际的代码将有助于识别问题。当您得到调试断言时,通常会有另一种方法进入调试器。如果您这样做,您可能会看到问题所在。非常感谢…您的解释很有意义。但让我困惑的是,我正在处理的文本文件只有字符0-255…还有,为什么使用相同文件的相同场景不会导致gcc出现问题?可能存在问题,但您没有看到,因为测试已禁用。实际上,
glibc
以一种设计为按照通常预期的方式实现
功能(尽管标准没有要求)…
-fsanize=undefined
可能会改变一些事情,因为这是一个常见的UB问题,但是您可以找到
glibc
toupper
实现,您可以看到它只是使用值作为索引来访问数组……谢谢大家。我发现我使用了一个带有unicode字符的函数,比如isalpha。