【发布时间】:2015-02-14 07:00:58
【问题描述】:
我很难用我的代码理解这个运行时错误。这是我班上的一项作业,我认为这很容易,但有些奇怪的事情正在发生。我在下面发布了我的代码。
这个任务的提示是创建一个程序,要求用户输入一些单词,然后它应该输出有多少单词。我有一个朋友运行该程序并且它可以工作,但是,每当我尝试运行它时,我都会收到此运行时错误。 [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;
}
【问题讨论】:
-
您并没有停留在实际输入长度上,因此您正在处理不确定的垃圾粘贴输入字符串的长度。
-
当我在我的 c++ 上运行您的代码时,我将
nullptr更改为NULL(我使用的是旧版本,所以没有nullptr)并且我的程序编译没有任何问题,但数字单词数是错误的,如果我输入 3 个单词,则输出为 2 个单词,如果我输入 20 个单词,则输出为 19 个单词。 -
您的代码有多个问题。未能从输入的实际行的末尾(而不是缓冲区的末尾)进行测试是其中之一。在尝试识别任何单词之前等待第一个空格字符是另一回事(这就是您不计算第一个单词的原因)。
-
@ArunA.S 未定义的行为可以以不同的方式表现出来。您的编译器要么将 char 设置为无符号,要么不检查传递给空间等的值,或者将缓冲区初始化为零。
-
@Alan Stokes,我不明白你在说什么(我没那么聪明,还是个新手)。我的意思是,当我编译@Dranslin 的代码时,由于
nullptr而显示错误。我的编译器是 gcc 4.8.0 ( Devc++ ),所以我将nullptr更改为NULL并且程序编译并给出了输出(尽管字数似乎总是比我输入的数字少 1 )。请解释你的意思(我没有得到任何未定义的行为)。
标签: c++ visual-studio c-strings