Ошибка, возвращаемое значение 3221225477

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector <string> words;

void splitSent (string sent);int main ()
{
string sent;

cout << "Enter your sentence: " << endl;
getline (cin, sent);
splitSent (sent);string finalSent;
for (unsigned int i = 0; i < words.size(); i++)
{
if (words[i] == "i")
{
finalSent += "I ";
i++;
}

if (words[i] == "instructor")
{
finalSent += "name of prof ";
i++;
}

finalSent += words[i];
finalSent += " ";
}

cout << "Final sentence is: " << finalSent << "." << endl;return 0;
}void splitSent (string sent)
{
int Pos = 0; // Position
string word;

while (Pos < sent.length())
{
while ((Pos < sent.length()) && (sent[Pos] != ' '))
{
word += sent[Pos];
Pos++;
if (sent[Pos] == '.')
{
break;
}
};
words.push_back(word);
word = "";
Pos++;
}
}

Пока это моя программа, я пытаюсь заменить «я» на «я» и заменить «инструктор» именем моего проф. Однако каждый раз, когда в предложении более двух «я», я получаю сообщение об ошибке и не знаю почему. Я также получаю то же сообщение об ошибке, если в моем предложении есть слово «инструктор»

0

Решение

нет необходимости вручную увеличивать i, Вот что for петля делает кстати. Увеличивая i вы превышаете размер вектора и, очевидно, получаете доступ к неопределенной памяти

string finalSent;
for (unsigned int i = 0; i < words.size(); i++)
{
if (words[i] == "i")
{
finalSent += "I ";
continue;
//i++;
}

if (words[i] == "instructor")
{
finalSent += "name of prof ";
continue;
//i++;
}

finalSent += words[i];
finalSent += " ";
}
1

Другие решения

Как Obicere упомянул в комментариях, вы, вероятно, получаете ошибку сегментации, потому что вы увеличиваете i вручную, а затем попросить words[i], Вы, вероятно, получали только segfault, когда «i» или «инструктор» были в конце предложения, когда переменная i было уже так высоко, как и должно быть. Но тогда ты сделал i++, так i был один больше, чем должно быть, и words[i] просит элемент words это прошло его конец. Вот как происходят сегфолты.

Вы должны быть более осторожными с вашим if заявления и что происходит после них. Кстати, использование глобальных переменных — плохая идея. В этом случае вы не должны определять words в верхней части вашего файла, но вы должны передать его по ссылке. Кроме того, хороший редактор (emacs или vim) может привести ваш код в порядок.

Я не совсем уверен, что вы хотели, поэтому я мог испортить управление потоком, но этот код должен быть намного ближе к тому, что вы хотите.

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void splitSent (string sent, vector<string>& words);

int main () {
string sent;
vector<string> words;

cout << "Enter your sentence: " << endl;
getline(cin, sent);
splitSent(sent, words);

string finalSent;
for (unsigned int i = 0; i<words.size(); i++) {
if (words[i] == "i") {
finalSent += "I";
} else if (words[i] == "instructor") {
finalSent += "name of prof";
} else {
finalSent += words[i];
}
if (i<words.size()-1) { // Don't put a space before the period
finalSent += " ";
}
}
finalSent += ".";

cout << "Final sentence is: " << finalSent << endl;

return 0;
}

void splitSent (string sent, vector<string>& words) {
int Pos = 0; // Position
string word;

while (Pos < sent.length()) {
while ((Pos < sent.length()) && (sent[Pos] != ' ')) {
word += sent[Pos];
Pos++;
if (sent[Pos] == '.') {
break;
}
}
words.push_back(word);
word = "";
Pos++;
}
}
0

По вопросам рекламы [email protected]