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。
答案 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),这会引发您抱怨的运行时异常。