C++ 从string.find的一个实例转到下一个实例

C++ 从string.find的一个实例转到下一个实例,c++,string,replace,C++,String,Replace,这是另一个经典的谜题。。。我的目标是在字符串中取每个单词的第一个字母,并将其放在该单词的末尾,再加上-ay(Pig拉丁语)。我设法改变了第一个单词。但我该如何继续下一步呢?我咨询了不同的来源,论坛,但我仍然被卡住了。。。有什么建议吗?:)可能是这样的:pos=a.find(“,pos+1)?见下面的代码: #include <iostream> #include <string> int main() { std::string a = "hell

这是另一个经典的谜题。。。我的目标是在字符串中取每个单词的第一个字母,并将其放在该单词的末尾,再加上-ay(Pig拉丁语)。我设法改变了第一个单词。但我该如何继续下一步呢?我咨询了不同的来源,论坛,但我仍然被卡住了。。。有什么建议吗?:)可能是这样的:pos=a.find(“,pos+1)?见下面的代码:

#include <iostream>
#include <string>


int main()

{
    std::string a = "hello what is going on";
    std::string b = "ay ";
    std::size_t pos = a.find(" ");
    int length = a.length();
    std::string first = a.substr(0,1);

        for (int i = 0; i <= length; i++)
        {   
            if (pos != std::string::npos)
                {
                a.replace(pos, a.length(), first + b);   //I guess I have to change sth. here.
                }                                        //Maybe a while-loop?
        }

    a.replace(0, 1, "");
    std::cout << a;            //Output: "ellohay"; **goal**: "ellohay hatway siay oingay noay"
    
}

#包括
#包括
int main()
{
std::string a=“你好,发生了什么事”;
std::string b=“ay”;
std::size\u t pos=a.find(“”);
int length=a.length();
std::string first=a.substr(0,1);

对于(inti=0;i,与字符串操作任务一样,保留单独的“源”和“目标”字符串比“动态”修改单个字符串容易得多

对于您的情况,下面的
PigLatin
函数按您的要求执行(尽管我不是在这里验证您对PigLatin的定义)。它还处理单词之间的多个空格,并有一个代码块来处理非字母或空格的字符,您可以根据需要修改这些字符

#包括
#包括
std::string PigLatin(std::string和input)
{
//if(input.empty())返回“”;//不确定要对空字符串执行什么操作?
std::string answer=“”;
bool-inword=false;
char firstc='';//从未使用Unitized,但为其指定一个值以使警告静音
用于(自动测试C:输入){
if(std::isspace(testc)){//Space:检查是否有当前单词。。。
if(in word){//…并添加最后一个字符+“ay”
答案+=第一个C;
回答+=“是”;
}
inword=false;//标记我们现在在单词之外
answer+=testc;//并将此空格添加到答案中。
}
else if(std::isalpha(testc)){//Letter:检查它是否是单词中的第一个。。。
如果(!inword)firstc=testc;//如果是,请保存它以备将来使用
else-answer+=testc;//否则追加到答案
inword=true;
}
否则{//非alpha,非空格。。。
答案+=测试C;
}
}
//处理terminal case,其中一个单词后面没有空格:
如果(中文){
答案+=第一个C;
回答+=“是”;
}
返回答案;
}
int main()
{
std::string a=“你好……发生了什么事”;
std::string b=PigLatin(a);
std::cout很简单:

只需将字符串标记化,获取每个标记,将标记的第一个字符保存在某个变量中,删除第一个字符并构建所需的内容

#包括
#包括
#包括
使用名称空间std;
int main(){
//根据提供的文本生成istringstream对象
自动输入=istringstream{“你好,发生了什么事”};
字符串标记=”;
字符串输出=”;
//标记化提供的文本输入
while(输入>>令牌){
char first=令牌[0];//保存令牌的第一个字符
擦除(0,1);//从令牌中删除第一个字符
output=output+token+first+“ay”+“”;//构建您需要的
}
//好的,打印输出以检查是否一切正常

cout这里有一个简单的方法,可以使用标准算法实现您想要的功能:

std::ostringstream result;//存储结果
std::istringstream iss{a};//将字符串转换为流
std::transform(std::istream_迭代器{iss},
std::istream_迭代器{},
std::ostream_迭代器{result},
[&b](自动常量和word){
返回单词.substr(1)+单词[0]+b;//pig拉丁语
});

std::cout好的,多亏了你们大家,我想出了一些“混合”的方法来实现你们的想法,比如:

#include <iostream>
#include <string>


int main()

{
    std::string a = "hello what is going on";
    std::string b = "ay ";
    std::string c = "ay";
    std::string delimiter = " ";
    std::size_t pos = 0;
    std::string token;
    std::string output = "";
    

    while ((pos = a.find(delimiter)) != std::string::npos)
    {
        token = a.substr(0, pos);
        char first = token[0];
        token.replace(pos, token.length(), first + b);
        token.erase(0, 1);
        std::cout << token << std::endl;
        a.erase(0, pos + delimiter.length());
    }
    char firstA = a[0];
    a.erase(0, 1);
    
    std::cout << a + firstA + c  << std::endl;
}
#包括
#包括
int main()
{
std::string a=“你好,发生了什么事”;
std::string b=“ay”;
std::string c=“ay”;
std::字符串分隔符=”;
标准:尺寸\u t位置=0;
字符串标记;
std::字符串输出=”;
while((pos=a.find(delimiter))!=std::string::npos)
{
令牌=a.substr(0,位置);
char first=token[0];
token.replace(pos,token.length(),first+b);
令牌擦除(0,1);

std::我可以将字符串分割成一个字符串向量,然后在一个环井中操纵每个字符串,你已经知道了大部分答案。当你尝试类似于
pos=a.find(“,pos+1)”的东西时发生了什么事?
?而且,并不是那么简单。@Igor Tandetnik:类似的东西出来了:ellohayhayh.)@Thomas Sablik:我会尝试一下。我还没有研究过向量,所以需要阅读一下如何做到这一点。我喜欢这段代码,因为你使用了“基本”技术(if、else等)。我对编码还是相当陌生(从几个月前开始)因此,我没有使用代码中的某些部分,如std::isspace或std::isalpha。谢谢你的想法!!谢谢你,cigien!这似乎是最简洁的解决方案:)现在我只需要弄清楚所有不同部分的实际功能…@BisAndiGrenzen看一看,这应该会有所帮助。
#include <iostream>
#include <string>


int main()

{
    std::string a = "hello what is going on";
    std::string b = "ay ";
    std::string c = "ay";
    std::string delimiter = " ";
    std::size_t pos = 0;
    std::string token;
    std::string output = "";
    

    while ((pos = a.find(delimiter)) != std::string::npos)
    {
        token = a.substr(0, pos);
        char first = token[0];
        token.replace(pos, token.length(), first + b);
        token.erase(0, 1);
        std::cout << token << std::endl;
        a.erase(0, pos + delimiter.length());
    }
    char firstA = a[0];
    a.erase(0, 1);
    
    std::cout << a + firstA + c  << std::endl;
}