我很难用我的代码理解这个运行时错误。这是我班上的任务,我觉得这很容易,但是有些奇怪的是锣。我在下面发布了我的代码。
此分配的提示是创建一个程序,要求用户输入以输入一些单词,然后它应输出有多少单词。我有一个朋友运行该程序,它工作,但是,每当我尝试运行它时,我得到这个运行时错误。 [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;
}
答案 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;
}