调试断言失败c> = -1&amp;&amp; c <= 255

时间:2015-02-14 07:00:58

标签: c++ visual-studio c-strings

我很难用我的代码理解这个运行时错误。这是我班上的任务,我觉得这很容易,但是有些奇怪的是锣。我在下面发布了我的代码。

此分配的提示是创建一个程序,要求用户输入以输入一些单词,然后它应输出有多少单词。我有一个朋友运行该程序,它工作,但是,每当我尝试运行它时,我得到这个运行时错误。 [http://imgur.com/FcdN3zK]

请记住,我是C ++的初学者和一般的编程,因此我无法理解非常技术性的回答。提前感谢您的帮助。

#include <string>
#include <iostream>
#include <cstring>

using namespace std;

int wordCounter(char *);

int main()
{
    char *stringArray = nullptr;
    stringArray = new char[120];

    cout << "Please enter a saying or a phrase that has more than one word: " << endl;
    cin.getline(stringArray, 120);

    int words = wordCounter(stringArray);
    cout << "Your statement contains " << words << " words." << endl;

    system("pause");
    return 0;
}

int wordCounter(char *stringTest)
{
    char characterToTest;
    int numberOfWords = 0;
    for (int i=0; i < 120; i++)
    {
        characterToTest = *(stringTest + i);
        if (isspace(characterToTest) && i != 120)
        {
            char characterToTestTemp = *(stringTest + (i + 1));
            if (isalnum(characterToTestTemp))
            {
                numberOfWords++;
            }
        }
    }
    return numberOfWords;
}

4 个答案:

答案 0 :(得分:3)

你不是在输入字符串的终止处停止,而是进入我们输入缓冲区尾端留下的非输入,不确定的缓冲区数据。

这是您可能尝试做的事情:

int wordCounter(const char *str)
{
    int numberOfWords = 0;
    while (*str)
    {
        // skip any leading whitespace
        while (*str && isspace(static_cast<unsigned char>(*str)))
            ++str;

        // if we're still on string data, we have another word
        if (*str)
        {
            // skip everything up to more whitespace
            while (*str && !isspace(static_cast<unsigned char>(*str)))
                ++str;

            // and count the word
            ++numberOfWords;
        }
    }
    return numberOfWords;
}

或类似的东西。可能需要应用额外的处理来计算标点符号等。一旦到达输入字符串的终止符,就会停止。

祝你好运。

答案 1 :(得分:2)

isspace和朋友们难以正确地打电话。具体而言,您无法安全地将char传递给他们,因为char值可能是否定的,而且不允许这样做,正如错误消息所示。

您应该转为unsigned char以确保安全:

isspace(static_cast<unsigned char>(characterToTest))

这不是主要问题,您需要先修复超限,但这也是您收到错误消息的部分原因。

答案 2 :(得分:0)

无论真正读取的输入字符串的长度如何,您的wordcount函数始终处理120个字符。所以你正在阅读字符串的结尾并处理未初始化的内存。

Microsoft docyumentation读取&#34;如果c不是EOF或者在0到0xFF范围内,则_isctype和_isctype_l的行为是未定义的。当使用调试CRT库并且c不是这些值之一时,函数会引发一个断言。&#34;

这是断言的原因。

C字符串是零终止的,您必须在循环中测试该条件。

int wordCounter(char *stringTest)
{
    char characterToTest;
    int numberOfWords = 0;
    for (int i = 0; i < 120; i++)
    {
        characterToTest = *(stringTest + i);
        if (characterToTest == 0)  
            break; // <-- exit the loop at the end of the string
        if (isspace(characterToTest) && i != 120)
        {
            char characterToTestTemp = *(stringTest + (i + 1));
            if (isalnum(characterToTestTemp))
            {
                numberOfWords++;
            }
        }
    }
    return numberOfWords;
}

你的计数功能可能有其他逻辑错误,比如不计算第一个单词。

答案 3 :(得分:0)

谢谢大家的帮助。阅读此内容(我确实认识到我有逻辑错误,如果用户没有输入任何东西并提交它,它仍然会打印1),我能够提出一个稍微不同的方法。< / p>

以下是修订后的代码。

#include <string>
#include <iostream>
#include <cstring>

using namespace std;

int wordCounter(char *, int);

int main()
{
    cout << "Please enter a saying or a phrase that has more than one word: " << endl;

    string testString;
    getline(cin, testString);

    int stringLength = testString.length();

    char *stringArray = nullptr;
    stringArray = new char[stringLength];

    strcpy(stringArray, testString.c_str());

    int words = wordCounter(stringArray, stringLength);
    cout << "Your statement contains " << words << " words." << endl;

    system("pause");
    return 0;
}

int wordCounter(char *stringTest, int length)
{
    char characterToTest;
    int numberOfWords = 1;
    for (int i=0; i < length; i++)
    {

            characterToTest = *(stringTest + i);

            if (isspace(characterToTest) && (i != length))
            {

                    char characterToTestTemp = *(stringTest + (i + 1));
                    if (isalnum(characterToTestTemp))
                    {
                            numberOfWords++;
                    }
            }
    }
    return numberOfWords;
}