2012-08-26 61 views
1

我正在阅读一本C++书籍,以及一本用于创建猪拉丁语翻译器的练习。我已经想出了翻译一个单词的所有必要步骤。现在我在处理多字字符串时遇到了很多麻烦。猪拉丁字符串迭代,多字

基本上我需要一些标准成语来帮助你迭代每个单词的字符串并对每个单词执行一个动作。

到目前为止我所使用的功能最多只是sl and而我只是卡住了。

string sentenceToPigLatin(string str) { 
    string result = ""; 
    for (int i = 0; i < str.length(); i++) { 
     char ch = str.at(i); 
     if (ch == ' ') { 
      result += toPigLatin(str.substr(0, i)); 
      str = str.substr(i); 
     } 
    } 
    return result; 
} 

您可以假设toPigLatin()对不包含空格的单词执行正确的过程。

+0

HTTP:/ /stackoverflow.com/questions/236129/splitting-a-string-in-c - 你会从那里得到很多想法。 – Mat

回答

4

你可以把整个字符串在stringstream和使用提取运算走出一个字:

#include <sstream> // for stringstreams 

string sentenceToPigLatin(const string& str) 
{ 
    istringstream stream(str); 
    ostringstream result; 
    string temp; 
    while (stream >> temp) 
      result << toPigLatin(temp) << ' '; 
    return result.str(); 
} 

另一种方法是用stream iterators一起使用standard algorithms

#include <algorithm> // for transform 
#include <iterator> // for istream_iterator and ostream_iterator 

string sentenceToPigLatin(const string& str) 
{ 
    istringstream stream(str); 
    ostringstream result; 
    transform(istream_iterator<string>(stream), 
       istream_iterator<string>(), 
       ostream_iterator<string>(result, " "), 
       toPigLatin); 
    return result.str(); 
} 
+0

是否是供参考传递的?即时通讯新的C + +和混淆了(const和&)参数。 &被裁判传球了吧?但常量是这样,它不能改变? – mharris7190

+0

正确。这样避免了潜在的昂贵副本。无论如何,Stringstream会在自己的缓冲区中创建一个字符串的副本。 – jrok