2014-09-24 2 views
1
void piglatin(string str) 
{ 
    string temp = str; //copies the string passed to the function into temp. 
    temp = temp + str.at(0); //adds the first character of the word to the end of the word. 
    temp = temp.erase(0, 1); //deletes the first character from the temp string. 
    temp = temp + "AY"; //adds "AY" to the temp string 
    cout << temp << " "; //prints out the word followed by a space. 
} 

string userIn("I NEED THIS IN PIG LATIN"); 
    istringstream iss(userIn); 

    do 
    { 
     string sub; 
     iss >> sub; 
     piglatin(sub); 
    } while (iss); 

так я пытаюсь использовать этот метод, чтобы разбить строку в C++, но я продолжаю получать сообщение об ошибке, но программа делает то, что я хочу, чтобы это сделать. Мне просто нужно избавиться от ошибки R6010.Попытка разбить строку в C++, но получаю ошибку R6010

+0

Не могли бы вы опубликовать весь вывод, который вы получаете? –

+0

вот директивы, которые я включил в свою программу. # включить Включены Включены Koolkirtzz

+0

Вот полная ошибка. Исключение первого шанса в 0x7609C42D в Project2.exe: исключение Microsoft C++: std :: out_of_range в ячейке памяти 0x0036F300. Если есть обработчик для этого исключения, программа может быть безопасно продолжена. – Koolkirtzz

ответ

3

Ваш код в основном хорошо, это просто, что вы проверяете для отслуживших файла (или с истекшим строки в данном случае) неправильно и это вызывает пустую строку, которая будет отправлена ​​в 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++ :-)

+0

Вы были быстрее меня :) –

+0

Спасибо, человек. Он работал как магия !!! Ты обалденный!! – Koolkirtzz

+0

Да, у оригинальной проблемы с лабиной у свиньи есть разные правила, но наш профессор дал нам разные правила, чтобы сделать это немного легким для нас, поэтому он сказал, беря первое письмо и положив его в конец, а затем добавьте ay в конец слова и сделайте это каждому слову в предложении, которое вводит пользователь. – Koolkirtzz

1

... и из-за ошибки, упомянутой в первом ответе, ваш код завершает вызов piglatin(), передавая пустую строку.

В этот момент str.at (0) приводит к явному неопределенному поведению (нет символа # 0 в полностью пустой строке), который выдает исключение среды выполнения, о котором вы жалуетесь.

+1

'str.at (0)' не вызывает неопределенного поведения; он определен для исключения. –

Смежные вопросы