试图在C ++中拆分字符串,但不断收到错误R6010

时间:2014-09-24 01:08:44

标签: c++

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。

2 个答案:

答案 0 :(得分:3)

你的代码主要是好吧,只是你错误地检查了文件结尾(或者在这种情况下是字符串结尾)并且&# 39;导致空字符串被发送到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

我认为完全正确的猪拉丁语(我似乎记得有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 ";
}

如果您打算切换到&#34;正确的&#34;它可能值得保持为单独的操作。猪拉丁语,因为它可能更复杂,或者如果这是一项任务,你不会被认为是C ++专家: - )

答案 1 :(得分:1)

...并且由于第一个答案中提到的错误,您的代码最终会调用piglatin()传递一个空字符串。

此时,str.at(0)导致明显的未定义行为(完全空字符串中没有字符#0),这会引发您抱怨的运行时异常。