【问题标题】:c++ aut replace text row of character string [duplicate]c ++ aut替换字符串的文本行[重复]
【发布时间】:2016-01-08 19:09:29
【问题描述】:

我发现一个小错误,当我输入我的电子邮件时,发现结果与预期不符,结果是符号'@'变成了'%40',我想把文字'%40'改成'@' 的符号。 ok 简单的问题,如果发现'%40'行字符串自动变成'@'的符号。

下面的代码只能工作1次,但我想在他的Fox中找到任何文本'%40'是@

char text[4080] = "asdnisadnias%40gmail.com,userd%40gmail.com,aas%40mail.com";
string data = text;
size_t post;
post = data.find("%40");
data.replace(post,3,"@");
cout<<data;

输出:asdnisadnias@gmail.com,userd%40gmail.com,aas@mail.com

【问题讨论】:

  • 您的意思是它只用“@”替换“%40”的第一个实例,并且您希望它替换“%40”的所有实例吗?
  • 我的意思是,把%40全部替换成@
  • 为什么需要string data = text 初始化而不是string data = "..."

标签: c++


【解决方案1】:

你可以把它放到一个循环中:

char text[4080] = "asdnisadnias%40gmail.com,userd%40gmail.com,aas@mail.com";
string data = text;
for (size_t pos = 0; (pos = data.find("%40", pos)) != std::string::npos; pos++)
{
    data.replace(pos,3,"@");
}
cout << data;

在这里,pos 跟踪您搜索到的位置,从索引 0(字符串的开头)开始。然后,您继续在具有该位置的数据上调用 find ,直到您得到 std::string::npos 表示不再有匹配项。

在这种情况下,pos++ 不是严格要求的,但我们可以递增 1,因为我们替换为长度为 1 的“@”。这在用单个反斜杠替换双反斜杠等情况下可能很重要。

【讨论】:

    【解决方案2】:

    当有一些并发时,简单地继续替换。对于电子邮件来说,它已经足够有效了。

    char text[4080] = "asdnisadnias%40gmail.com,userd%40gmail.com,aas@mail.com";
    string data = text;
    size_t post;
    while((post = data.find("%40")) != string::npos)
    {
        data.replace(post,3,"@");
    }
    cout<<data;
    

    【讨论】:

    • 您正在使用 size_t 作为 bool 类型的有符号值,您需要将表达式转换为 (size_t)
    • 像这样:while((post = (size_t) (data.find("%40") != string::npos)))
    • 我不这么认为。它将 size_t (find) 与 size_t (string::npos) 进行比较,结果为 bool。它编译时没有警告。
    • 它会编译,但最好将它转换为理解:)
    • 没有选角。所有类型都是一样的。您是否使用 int 转换以下代码: while(n != 0){..} 不,因为您正在比较两个相同类型的数字。检查 string::find 和 string::npos 的文档
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2011-09-26
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多