C++ C++;比较文本文件和分段错误(核心转储)

C++ C++;比较文本文件和分段错误(核心转储),c++,text,compare,fault,C++,Text,Compare,Fault,我在一个作业上遇到了麻烦,我在stack和google上搜索了很多地方,但都没有找到问题所在 现在,到目前为止,我唯一的代码是让用户输入一个句子,然后将句子分成不同的字符串。我还需要将它与我得到的文本文件进行比较 第一个问题:我将单词拆分成不同字符串的方法有时才有效。例如,当我写“历史人物”时,它告诉我有一个分段错误,但如果我输入“历史人物”(末尾有空格),它就可以正常工作。我不知道问题出在哪里 第二个问题是,我不知道如何逐行比较字符串和文本文件,它似乎将整个文件存储到字符串变量“text”中

我在一个作业上遇到了麻烦,我在stack和google上搜索了很多地方,但都没有找到问题所在

现在,到目前为止,我唯一的代码是让用户输入一个句子,然后将句子分成不同的字符串。我还需要将它与我得到的文本文件进行比较

第一个问题:我将单词拆分成不同字符串的方法有时才有效。例如,当我写“历史人物”时,它告诉我有一个分段错误,但如果我输入“历史人物”(末尾有空格),它就可以正常工作。我不知道问题出在哪里

第二个问题是,我不知道如何逐行比较字符串和文本文件,它似乎将整个文件存储到字符串变量“text”中

#包括
#包括
#包括
使用名称空间std;
int名词(字符串n)
{
ifstream输入文件;
bool found=false;//首先将布尔值设置为false
字符串文本;
inputfile.open(“名词”);//打开文本文件
如果(!inputfile.is_open())
{//检查以确保文件已打开
库特
当我写“历史人物”时,它告诉我有一个分割错误,但如果我输入“历史人物”(末尾有空格),它就可以正常工作

很简单。你的
while
循环在字符串上运行,直到它找到一个空格。但是如果没有空格怎么办?循环会终止吗?不会-它将继续,直到它最终在内存中的某个地方找到一个空格字符或崩溃或其他什么(基本上一切都可能发生,在输出的末尾加上感叹号)。如何解决这个问题?检查是否在字符串的末尾

while (sent[w1] != ' ' && w1 < sent.size()) ...
由于您将
getline
的分隔符设置为空格:
getline(inputfile,text“”)
。这意味着文件中的所有名词都用空格分隔,并在一行中列出。是这样吗?否?那么只需将分隔符更改为文件本身中使用的正确分隔符即可。(顺便说一句,如果每个名词都列在单独的一行中,则不需要指定分隔符
getline(inputfile,text)

此外,如果您检查文件是否无法打开,则不要继续读取,而是停止该函数的执行

if (!inputfile.is_open()) { // checks to make sure file is open
    cout << "Error" << endl;
    return false; // return for example or throw an exception
}

你也听说过这个原理吗?你的4个while循环看起来有点相似,不是吗?你可以编写一个函数来实现这个功能,然后调用它4次(或者像我前面说的,使用完全不同的方法)。

另一件事我忘了提,如果我只写“history”这个词,它会打印出“history!”idk感叹号来自何处?为什么不干脆
cin>>word1;cin>>word2;…
?请将代码简化为问题的一部分。您当前的代码包含许多与问题无关的内容-最小的示例通常看起来类似于良好的单元测试:只执行一个任务,并指定输入值为了重现性。@TobySpeight谢谢,下次我会记住的。谢谢你的建议,我刚刚发现比较文本文件功能很好,但我的循环试图解析原始句子,这导致了问题。我们不允许使用向量和数组,这就是我很难弄明白的原因。actually你的评论帮我在脑海中点击了一下,非常感谢!我昨晚几个小时都在想这个问题!再次感谢!很高兴我能帮上忙;)
noun1 noun2 noun3 noun4 etc.
if (!inputfile.is_open()) { // checks to make sure file is open
    cout << "Error" << endl;
    return false; // return for example or throw an exception
}
int w1 = 0;
int w2 = 0;
int w3 = 0;
int w4 = 0;