Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;标点符号后将字符串拆分成新行_C++_String - Fatal编程技术网

C++ C++;标点符号后将字符串拆分成新行

C++ C++;标点符号后将字符串拆分成新行,c++,string,C++,String,我正在尝试学习字符串,我已经找到了如何替换和插入现有字符串的方法。我现在有3个字符串,我已经声明为常量,我已经将它们合并成一个字符串变量,将它们一一放在一起 我还将这些字符串中出现的每一个“Hi”都改为“Bye”。我的3个字符串捆绑成一个字符串,如下所示: “嗨!我的名字是xxxx!我想独自一人,但我不知道怎么做,你能帮我吗?” 我希望它显示为: 你好 我的名字是xxxx! 我想独自一人,但我不知道怎么做,你能帮我吗 一旦出现截取,我希望使用replace works插入一个换行符“\n”,但这

我正在尝试学习字符串,我已经找到了如何替换和插入现有字符串的方法。我现在有3个字符串,我已经声明为常量,我已经将它们合并成一个字符串变量,将它们一一放在一起

我还将这些字符串中出现的每一个“Hi”都改为“Bye”。我的3个字符串捆绑成一个字符串,如下所示: “嗨!我的名字是xxxx!我想独自一人,但我不知道怎么做,你能帮我吗?”

我希望它显示为: 你好 我的名字是xxxx! 我想独自一人,但我不知道怎么做,你能帮我吗

一旦出现截取,我希望使用replace works插入一个换行符“\n”,但这意味着标点符号将消失,使用insert将首先在标点符号之前插入换行符,而不会继续到下一个换行符,从而导致: “嗨! 我的名字是xxxx!我想独自一人,但我不知道怎么做,你能帮我吗?”

为了简化代码,我将代码改为只包含点,一旦解决,同样的解决方案可以应用于任何其他部分,如问号或感叹号

关于如何解决这个问题有什么建议吗

#include <iostream>
#include <string>

using namespace std;

string const Text0 = "Hi.";
string const Text1 = "My name is xxxx.";
string const Text2 = "I would like to be on my own but I don't know how to, could you help me.";
string const Text3 = "I would, but I don't know how to.";

string text = Text0 + Text1 + Text2 + Text3;

int main() {

    while (text.find("I") != string::npos) {
        text.replace(text.find("I"), 1, "J");

    }
    while (text.find("like") != string::npos) {
        text.replace(text.find("like"), 4, "milk");
    }

    text.insert(text.find("."), "\n");


    cout << text;
    return 0;
}
#包括
#包括
使用名称空间std;
字符串常量Text0=“嗨。”;
string const Text1=“我的名字是xxxx。”;
string const Text2=“我想一个人呆着,但我不知道怎么做,你能帮我吗。”;
string const Text3=“我会的,但我不知道怎么做。”;
字符串text=Text0+Text1+Text2+Text3;
int main(){
while(text.find(“I”)!=string::npos){
文本。替换(文本。查找(“I”),1,“J”);
}
while(text.find(“like”)!=string::npos){
text.replace(text.find(“like”),4,“milk”);
}
text.insert(text.find(“.”,“\n”);

cout您可以创建自己的短函数,在每个标点符号后添加换行符

例如:

void addNewLines(std::string *text)
{
    for (int i = 0; i < text->length(); i++)
    {
        if ((*text)[i] == '!' || (*text)[i] == '?' || (*text)[i] == '.')
        {
            (*text)[i + 1] = '\n';
        }
    }
}
void addNewLines(标准::字符串*文本)
{
对于(int i=0;ilength();i++)
{
如果((*text)[i]='!'| |(*text)[i]='?'| |(*text)[i]=')
{
(*文本)[i+1]='\n';
}
}
}
正如您在这段代码中所看到的,在for循环中,您将从字符串的第一个字符转到最后一个字符,在每个标点符号之后,您将用
\n
字符替换空格


我在这里使用指针是为了防止将字符串复制到函数中,以防它是一个巨大的字符串,但您可以不使用指针,这样语法就更简洁了。

insert是用于此项工作的工具。请展示您的使用情况,以便我们可以帮助您使其工作。使用replace可以工作,但这意味着标点符号将消失ar——只有这样编码才行。使用铅笔和纸重新检查作业,并改进/更改设计,以使标点符号不会消失。一旦您了解如何使用铅笔和纸来完成,请将这些计划转换为代码。简单而粗糙的方法提示:您可以将
替换为
”\n
,对于要替换的其他标点字符也是一样。“使用insert将首先在标点之前插入换行符”-只需在插入的索引中添加一个?将代码添加到OP中。是否可以在不使用新函数的情况下执行此操作?尝试只使用一个函数来处理所有操作。但是,这确实有效。如果您不确定标点符号后是否有空格,则可以在If语句中添加一个复选框来检查是否存在此问题。然后,如果e不是空空间。您可以使用insert()函数在此处插入“\n”,或手动拆分字符串添加“\n”并将其复制回。但不建议手动执行,因为您已经有insert()函数为你做。是的,没有新函数也可以做。只要把这个for循环放在你想要的地方。然后没有新函数你就不需要指针。好吧,我让它工作了。但是如果我使用“I+1”,它会从下一个单词中删除第一个字母(因为它们粘在一起),如果我只使用I,它会删除标点符号。是的,这是我在第一条评论中说的,如果你知道标点符号后不会有空格,那么在当前的if语句中添加另一个if语句,它将检查if((*text)[I+1]='')
(检查“I+1”是否为空格)。如果“I+1”为空格,请执行此
(*text)[i+1]='\n';
,否则,如果“i+1”不是一个空格,则使用insert()函数。您可能需要执行以下操作:
text->insert(i,“\n”)
(同样,语法是这样的,因为我使用了指针)。