当我尝试编译底部代码时尝试进行分配,并且我得到以下调试断言失败的存根:
文件: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;
}
答案 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个问题,然后查看是否可以调试代码。