C++ Visual Studio:调试断言失败!表达式:c >= -1 && c <= 255

Posted

技术标签:

【中文标题】C++ Visual Studio:调试断言失败!表达式:c >= -1 && c <= 255【英文标题】:C++ Visual Studio : Debug Assertion Failed! Expression: c >= -1 && c <= 255 【发布时间】:2017-10-09 17:13:03 【问题描述】:

我正在尝试做一个基本的 C++ 分数/等级系统。我想验证用户输入。如果数据不是数字,我希望它显示错误消息。如果是,我希望它继续下去。

但是,如果用户输入一个字母,例如“a”或“A”。它吐出这个错误:

Debug Assertion Failed!
Program:
...ers\Alex\source\repos\worksheet_1.2a\Debug\worksheet_1.2a.exe
File: minkernel\crts\ucrt\appcrt\convert\isctype.cpp
Line: 36

Expression: c >= -1 && c <= 255

这是代码:

#include "stdafx.h"
#include <iostream>
#include <cctype>


using namespace std;  

int main()

    int score;

    // Recieve user input of score between 0-100. Stores input in score var
    cout << "\nWhat score did you get?\n" << endl;
    cin >> score;

    // Validating input

    if (!isdigit(score)) 
        if (score <= 59)
            cout << "Your grade is F" << endl;
        else if (score > 59 && score < 70)
            cout << "Your grade is D" << endl;
        else if (score > 69 && score < 80)
            cout << "Your grade is C" << endl;
        else if (score > 79 && score < 90)
            cout << "Your grade is B" << endl;
        else if (score > 89)
            cout << "Your grade is A" << endl;
    
    else 
        cout << "Sorry, that is not a number. Please try again." << endl;
    

    return 0;

如果输入数字,它可以正常工作,但如果输入字母,则根本不行。

我查看了基于“调试断言失败”的其他几个答案和视频,但找不到针对此特定错误的答案和视频。

感谢您的阅读和帮助!

【问题讨论】:

在调试器中运行时,输入字母时score有什么值?你可能需要char score; 而不是int score; 【参考方案1】:

isdigit 采用int 而不是char 是相当奇怪的,因为这就是它的用途(来自here,强调我的):

检查给定的 字符 是否是 10 个十进制数字之一: 0123456789.

如果 ch 的值不能表示为,则行为未定义 unsigned char 且不等于 EOF。

似乎isdigit 是一个相当大的陷阱,你很幸运被断言解雇了。无论如何,即使它需要一个int,你也应该传递一个char

 std::string s = "12asbc";
 std::cout << isdigit(s[0]);         // prints 1
 std::cout << isdigit(s[3]);         // prints 0

不管怎样,你的支票没什么意义。如果它按您的预期工作,您只会知道该数字不是一个数字,但如果用户输入 abcd 或任何不是数字的东西,您的代码仍然会失败。要检查输入是否正确,您可以这样做

int score;
if (std::cin >> score && 0 <= score && score <= 100) 
     // ok input
 else 
     // invalid input

【讨论】:

我试过这个。如果用户输入一个字符,它会给出错误。但是现在,如果用户给出一个数字,它什么也不做。当按下“Enter”时光标会跳到下一行并停留在那里并闪烁?【参考方案2】:

你为什么输入!isdigit(score) 而不是isdigit(score)? 不要将! 放在isdigit(score) 前面。 当参数为数字时,isdigit() 返回 True

【讨论】:

以上是关于C++ Visual Studio:调试断言失败!表达式:c >= -1 && c <= 255的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 调试断言失败 [关闭]

如何在 Visual Studio 2017 中禁用作为调试错误的失败断言?

Visual Studio 2017 - 断言失败没有提示?

Visual C++ 查找导致“调试断言失败”的行

如何禁用调试断言对话框 Visual Studio 或输出 exe

在 Visual C++ 2005 中开发的 Visual C++ 项目 - 在 Visual C++ 2010 中,打开菜单时调试断言失败,但发布模式有效,如何解决?