使用空终止字符数组的Debug Assertion failed错误

时间:2014-04-09 03:11:32

标签: c++ string debugging visual-studio-debugging

当我尝试编译底部代码时尝试进行分配,并且我得到以下调试断言失败的存根:

文件:f:\ dd \ vctools \ crt \ crtw32 \ convert \ istype.c

行:56

Experession c> = -1&& c< = 255

此错误消息似乎有些问题。我甚至没有f盘或目录,除非在isctype.c程序中计算行数,否则我的代码中没有56行。

目标是计算用户输入的单词数量。事先检查空格以及空终止字符。

以下代码已根据其他用户的评论修复

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

using namespace std;

int wordCount(int size, char wordArray[]);

int main(){
    const int SIZE = 100;
    char wordArray[SIZE];

    cout << "What is the string you wish to enter? ";
    cin.getline(wordArray, sizeof(wordArray));

    cout << "The number of words entered is: " << wordCount(strlen(wordArray), wordArray) << endl;
}

int wordCount(int size, char wordArray[]){

    int charCount = 0, wordCount = 0;

    //counts the number of words in the entered string
    for (int i = 0; wordArray[i] != '\0'; i++){
        if (isalnum(wordArray[i])){
            charCount++;
            if (isspace(wordArray[i + 1])){
                charCount = 0;
                wordCount++;
            }
        }
    }
    return wordCount;
}

3 个答案:

答案 0 :(得分:2)

此代码:

if (isspace(wordArray[i] && isspace(wordArray[i + 1]))){

有几个问题。您的括号位于错误的位置,因此您使用布尔参数调用issspace

此外,在循环遍历字符串结尾时,您应该从strlen获取字符串的大小。断言可能正在发生,因为您将无效的char值传递给isspace(例如负数)。

编辑:另请注意下一行:

wordArray[i] = wordArray[i++];

不会做你想要的。你想将其余的字符串移回一个,而不只是将一个字符复制到另一个字符。

答案 1 :(得分:2)

您收到此错误消息的原因是isspace()接受整数值(int)但对字符(通常为char类型)进行操作。您必须传递一个未初始化的负值,该值在isspace()处理的域之外。传递的值不正确,ispace()实现会轻轻地通知您软件中的此错误。必须已在具有f:\驱动器的计算机上编译库。该实现确实有超过56行代码。

同时...

使用wordCount(strlen(wordArray), wordArray)而不是传递SIZE。否则你将读取未初始化的值,这是不好的。

而不是run = false使用break并将{0}替换为while(1)。此循环也很可能不会像您认为的那样做。您只是用第二个字节覆盖第一个字节。您可能希望将所有字符移到左侧。

在你的上一个循环中,迭代直到你找到一个空字节('\0')而不是最多size,因为这也是不正确的。请注意,该字符串现在可能小于size;也许size根本不应该是一个参数......

鉴于这些问题,这里有一种解决问题的另一种方法,它不需要修改原始字符串。

int count_words(const char *s) {
    int count = 0;
    bool in_word = false;
    while (*s != '\0') {
        if (isspace(*s)) {
            in_word = false;
        }
        else if (in_word == false) {
                count += 1;
                in_word = true;
        }
        ++s;
    }
    return count;
}

答案 2 :(得分:0)

此断言错误来自C运行时库内部。据推测它是由一个拥有F驱动器的人建造的。行号在该源代码中。

断言的原因是您正在尝试测试非有效字符的字符类型。最可能的候选者是字符串终止符的空末尾。

你不应该传入大小,而是使用strlen()来查找它。那你就不会碰到null。

for (int i = 0; i < strlen(wordArray); i++) { ...

3个循环中的每个循环都是错误的,并且不会执行评论所说的内容。您应首先修复上述2个问题,然后查看是否可以调试代码。