猪拉丁程序不起作用
Posted
技术标签:
【中文标题】猪拉丁程序不起作用【英文标题】:Pig Latin Program Not Working 【发布时间】:2017-04-26 21:08:51 【问题描述】:好的,基本上这个程序应该有两个任务。
Task 1:是一个单词分隔函数,它接受这样的字符串
FOR EXAMPLE: "ExceedYourExpectations" to "Exceed your expectations"
任务 2:Pig Latin 函数,将单词的第一个字母移动到末尾并添加“ay”
FOR EXAMPLE: "Exceed your expectations" to "xceedEay ouryay xpectationseay"
在程序的主函数中它会这样做
-
要求用户输入一个输入字符串。
以输入字符串为附件调用分词函数
显示结果字符串
以单词分隔函数的结果字符串作为参数调用 Pig Latin 函数
显示结果猪拉丁字符串。
但由于某种原因,猪拉丁功能无法正常工作。相反,它将句子的第一个字母放在最后,导致输出
"xceed your expectationsEay" instead of "xceedEay ouryay xpectationseay"
有人可以帮我吗?我已经在这工作了大约 2 天,但我仍然无法正确处理。提前致谢!
#include <iostream>
#include <iomanip>
#include <cctype>
#include <string>
using namespace std;
// function prototype
void wordSep(string&);
string pigLatinString(string);
int main()
string input;
string converted;
//display unformatted sentence
cout << "Enter An Input String: " << endl;
cin >> input;
//seperate the words according to format
wordSep(input);
// display new formatted sentence
cout << "\nResult String: " << input << endl;
pigLatinString(input);
converted += pigLatinString(input) + " ";
cout << "\nPig Latin: " << converted << endl;
converted = "";
return 0;
// ====================================================
// function definition - converts input to a string where words are
separated by spaces and only the
//first word starts with a capital letter
void wordSep(string &input)
char tempLetter; //temporarily stores a letter from &input
int length;
length = input.size(); // get original length to use in the loop
for (int count = 1; count < length; count++) // count starts at 1 to ignore first word(1st capitalization)
tempLetter = input[count];
// if uppercase character is found add a space
if (isupper(tempLetter))
input.insert(count, 1 ,' ');
++count; //after insertion of a space character we need to add 1 to the index (this makes count go back to the capital letter)
//set the letter to lowercase (b/c only first word starts with an uppercase letter)
input[count] = tolower(input[count]);
string pigLatinString(string input)
string firstChar = input.substr(0,1);
string restChar = input.substr(1, input.size()-1);
return restChar + firstChar + "ay";
【问题讨论】:
请改进代码的缩进。 对不起,我已经修好了。现在应该可以正确格式化了。 首先,熟悉您的调试器。了解调试器后,解决一个简单的字符串问题不需要 2 天时间。其次,编写一个简单的main
函数,它只调用pigLatinString
,并用硬编码的数据对其进行测试。您不需要 main()
或您的程序中的所有其他内容来测试这样的功能。
yr piglatin 函数完全按照您的要求执行,您将整个字符串传入,然后告诉它将第一个字母移到末尾并添加“ay”。您必须将每个单词传递给它
这意味着 'wordsep' 必须返回一个单词向量
【参考方案1】:
您的 pig latin 函数没有给出您期望的输出的原因是因为您将整个字符串(包含空格和所有字符串)作为输入传递。如果您将输入的单词逐字传递,您将得到您期望的结果,如下所示:
#include <iostream>
using namespace std;
// This is your function
string pigLatinString(const string& input)
string firstChar = input.substr(0,1);
string restChar = input.substr(1, input.size()-1);
return restChar + firstChar + "ay";
// This function takes your input string and calls
// your pig latin function once for each word
string callPigLatinStringWordForWord(const string& input)
string result = "";
// Find first word
size_t startPosition = 0;
size_t spacePosition = input.find(' ', startPosition);
while (spacePosition != string::npos)
string word = input.substr(startPosition, spacePosition - startPosition);
result += pigLatinString(word) + " ";
// Find next word
startPosition = spacePosition + 1;
spacePosition = input.find(' ', startPosition);
// Finally transform the final word
result += pigLatinString(input.substr(startPosition));
return result;
int main()
string input = "Exceed your expectations";
string result = callPigLatinStringWordForWord(input);
cout << result;
return 0;
【讨论】:
【参考方案2】:在转换输出长度与输入长度不同的字符串时,在对原始字符串进行单次前向传递的同时创建新字符串通常更容易且更有效。
std::string pigLatinString(const std::string &source)
std::string target;
char first = '\0';
for (const auto ch : source)
if (first == '\0')
if (std::isspace(ch))
target += ch;
else
// remember the first char until the end of the word
first = ch;
else
if (std::isspace(ch))
target += first;
target += "ay";
first = '\0';
target += ch;
if (first != '\0')
target += first;
target += "ay";
return target;
【讨论】:
以上是关于猪拉丁程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章