Ваш код в основном хорошо, это просто, что вы проверяете для отслуживших файла (или с истекшим строки в данном случае) неправильно и это вызывает пустую строку, которая будет отправлена в piglatin()
, в результате чего в исключении str.at(0)
.
Вы можете исправить это (в том числе делая код полной работоспособной программы) с чем-то вроде:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
void piglatin(string str) {
string temp = str;
temp = temp + str.at(0);
temp = temp.erase(0, 1);
temp = temp + "AY";
cout << temp << " ";
}
int main() {
string userIn("I NEED THIS IN PIG LATIN");
istringstream iss(userIn);
string sub;
while (iss >> sub)
piglatin(sub);
cout << '\n';
return 0;
}
Выходной сигнал затем вы получаете:
IAY EEDNAY HISTAY NIAY IGPAY ATINLAY
, который я не думаю, полностью правильный Pig Latin (я, кажется, вспомнил, что были slightly different rules, где слова начинались с гласных, и вам нужно было перемещать согласные групп до конца, а не просто первый), но я оставлю вас решить эту проблему, если это необходимо.
С точки зрения того, как работает цикл:
while (iss >> sub)
piglatin(sub);
Это просто продолжается до извлечения элемента (слова в данном случае) не выполняется. Наивные код (который я свободно признаю, я был виновен) будет использовать что-то вроде:
do {
string sub;
iss >> sub;
piglatin(sub);
} while (!iss.eof());
но не принимает во внимание тот факт, вы не может быть в конце файла даже если извлечение завершилось неудачно, например, если ваша фраза имела место в конце или если вы сканировали целые числа, когда следующий токен в потоке был нецелым.
И, так же, как и в стороне, нет никакой реальной необходимости делать все эти операции в piglatin()
отдельно, и при этом нет необходимости в явной() временной строке. Вы могли бы заменить всю партию с:
void piglatin (string str) {
cout << str.substr(1) + str.at(0) + "AY ";
}
Было бы целесообразно держать как отдельные операции, если вы когда-либо намерены переход на «правильную» Pig Latin, так как это, вероятно, будет более сложным, или, если это и вы не должны быть экспертом на C++ :-)
Не могли бы вы опубликовать весь вывод, который вы получаете? –
вот директивы, которые я включил в свою программу. # включить Включены Включены –
Koolkirtzz
Вот полная ошибка. Исключение первого шанса в 0x7609C42D в Project2.exe: исключение Microsoft C++: std :: out_of_range в ячейке памяти 0x0036F300. Если есть обработчик для этого исключения, программа может быть безопасно продолжена. – Koolkirtzz