>温度) 字。推回(临时); cout,c++,C++" /> >温度) 字。推回(临时); cout,c++,C++" />

为什么会崩溃? 这是一个从原理和实践中使用C++的练习,你应该带一个你不喜欢的单词,让它“哔”出来。我得到了要运行的代码,但在此之前,我写了下面的代码,它崩溃了。我更好奇的是它为什么会崩溃?是不是“如果”(单词[i-1]==不喜欢)?如果是这样,为什么底部的If-check没有使程序崩溃?这可能是一个简单的答案,但我只是好奇地想知道 #include <iostream> #include "std_lib_facilities.h" using namespace std; int main() { vector<string> words; string temp; string dislike = "tuggo"; while(cin>>temp) words.push_back(temp); cout << "Number of words: " << words.size() << endl; sort(words.begin(),words.end()); for(int i = 0; i<words.size(); ++i) { if(words[i-1]==dislike) cout << "BEEP DONT SAY TUGGO WHOOPS I SAID TUGG--BEEP"; else if(i==0 || words[i-1]!=words[i]) cout << words[i] << endl; } keep_window_open(); } #包括 #包括“std_lib_facilities.h” 使用名称空间std; int main() { 向量词; 字符串温度; string=“tuggo”; 而(cin>>温度) 字。推回(临时); cout

为什么会崩溃? 这是一个从原理和实践中使用C++的练习,你应该带一个你不喜欢的单词,让它“哔”出来。我得到了要运行的代码,但在此之前,我写了下面的代码,它崩溃了。我更好奇的是它为什么会崩溃?是不是“如果”(单词[i-1]==不喜欢)?如果是这样,为什么底部的If-check没有使程序崩溃?这可能是一个简单的答案,但我只是好奇地想知道 #include <iostream> #include "std_lib_facilities.h" using namespace std; int main() { vector<string> words; string temp; string dislike = "tuggo"; while(cin>>temp) words.push_back(temp); cout << "Number of words: " << words.size() << endl; sort(words.begin(),words.end()); for(int i = 0; i<words.size(); ++i) { if(words[i-1]==dislike) cout << "BEEP DONT SAY TUGGO WHOOPS I SAID TUGG--BEEP"; else if(i==0 || words[i-1]!=words[i]) cout << words[i] << endl; } keep_window_open(); } #包括 #包括“std_lib_facilities.h” 使用名称空间std; int main() { 向量词; 字符串温度; string=“tuggo”; 而(cin>>温度) 字。推回(临时); cout,c++,C++,您正在访问单词[i-1],但是i从零开始。您无法访问负索引。您正在访问单词[i-1],但是i从零开始。您无法访问负索引。问题是单词[i-1]你从i=0开始所以你第一次使用的是一个未定义行为的负指数。问题是单词[i-1]你从i=0开始所以你第一次使用的是一个未定义行为的负指数 if(words[i-1]==dislike) 在循环的第一次迭代中,它应该在这一行崩溃 如果i=0,并且索引为i-1,则数组中不能有负索引 在循环的第一次迭代中,它应该在这一行崩溃 如果i=0,并且您的索引为i-1,则数

您正在访问
单词[i-1]
,但是
i
从零开始。您无法访问负索引。

您正在访问
单词[i-1]
,但是
i
从零开始。您无法访问负索引。

问题是
单词[i-1]
你从
i=0开始
所以你第一次使用的是一个未定义行为的负指数。

问题是
单词[i-1]
你从
i=0开始
所以你第一次使用的是一个未定义行为的负指数

if(words[i-1]==dislike)
在循环的第一次迭代中,它应该在这一行崩溃

如果i=0,并且索引为i-1,则数组中不能有负索引

在循环的第一次迭代中,它应该在这一行崩溃

如果i=0,并且您的索引为i-1,则数组中不能有负索引。

for(int i = 0; i<words.size(); ++i)
{
    if(words[i-1]==dislike)
        cout << "BEEP DONT SAY TUGGO WHOOPS I SAID TUGG--BEEP";
    else if(i==0 || words[i-1]!=words[i])
        cout << words[i] << endl;
}
for(int i=0;iYes


for(int i=0;i更改
if(words[i-1]==不喜欢)
if(words[i]==不喜欢)
在第一个条件返回false之前,不会计算底部条件。其他答案说明了第一个条件失败的原因。您可能还需要替换字符串文字“TUGGO”和variable@reformed我不知道你的意思是什么?模糊的标题不太可能对该网站的未来访问者有用。将
if(words[I-1]==不喜欢)
更改为
if(words[I]==不喜欢)
在第一个条件返回false之前,不会计算底部条件。其他答案说明了第一个条件失败的原因。您可能还希望将字符串文字“TUGGO”替换为variable@reformed我不知道你的意思是什么?模糊的标题不太可能对网站的未来访问者有用。否则如果(I==0 | |字[I-1]!=words[i])那么为什么允许这样做?@user2442335短路或。由于or的第一部分计算为true,因此不计算右侧(当i=0时)@帕迪,这似乎很奇怪,因为我想象它是一个or语句,所以所有的内容都被同时阅读。我想我是这样想的,因为我不是一台计算机。所有这些答案都是对的!我能给每个人打分吗?@user2442335 FDinoff说了什么…=)而且,我很确定第一个语句应该是
if(words[I]==厌恶)
。您要检查当前单词。另一部分只是防止显示重复的单词。是的,您可以向任何答案对您有帮助的人投票,并接受您认为最有用的答案。否则,如果(i==0 | | words[i-1]!=words[i])那么为什么允许这样做?@user2442335短路或。由于or的第一部分计算为true,因此不计算右侧(当i=0时)@帕迪,这似乎很奇怪,因为我想象它是一个or语句,所以所有的内容都被同时阅读。我想我是这样想的,因为我不是一台计算机。所有这些答案都是对的!我能给每个人打分吗?@user2442335 FDinoff说了什么…=)而且,我很确定第一个语句应该是
if(words[I]==厌恶)
。您要检查当前单词。另一部分只是防止重复显示单词。是的,您可以向任何答案对您有帮助的人投票,并接受您认为最有用的答案。