C ++查找和替换功能的单引号问题

Posted

技术标签:

【中文标题】C ++查找和替换功能的单引号问题【英文标题】:Single quote issues with C++ find and replace function 【发布时间】:2010-11-08 09:29:17 【问题描述】:

这是我在字符串中查找序列并将其替换为另一个序列的代码:

std::string find_and_replace( string &source, string find, string replace )

    size_t j;
    for ( ; (j = source.find( find )) != string::npos ; )
    
        source.replace( j, find.length(), replace );
    
    return source;

当我调用类似的东西时一切正常:

find_and_replace(test, "foo", "bar")

我的应用程序要求我用两个单引号代替一个单引号,而不是一个双引号。例如我会打电话:

find_and_replace(test, "'", "''")

但是每当我调用它时,该函数都会由于某种原因冻结。有谁知道这个问题的可能原因是什么?

编辑:根据我得到的答案,我已经修复了代码:

std::string find_and_replace( string &source, string find, string replace )

    string::size_type pos = 0;
    while ( (pos = source.find(find, pos)) != string::npos ) 
        source.replace( pos, find.size(), replace );
        pos += replace.size();
    
    return source;

我希望这可以帮助一些遇到同样问题的人。

【问题讨论】:

嗯,投反对票有什么理由吗?没有理由的投反对票是没有用的,因为它们不会告诉创作者如何改进他们的问题。 【参考方案1】:

你有一个无限循环,因为你的条件没有前进。您总是在运行 j = source.find( find ),但您将 ' 替换为 '',因此您总是每次都找到第一个撇号并在字符串中添加一个新的撇号。

每次替换某些内容时,您需要通过向前扫描的位置移动来确保不会两次匹配同一个撇号。

find 函数采用第二个参数,它是字符串中查找子字符串的起始位置。找到第一个匹配的位置后,将起始位置向上移动到该位置加上要替换它的字符串的长度。

【讨论】:

【参考方案2】:

因为您将 ' 替换为 '',然后再次搜索 ',找到您刚刚放在那里的第一个。你替换哪个。以此类推。

【讨论】:

【参考方案3】:

您正在尝试替换您添加的相同字符串。

【讨论】:

【参考方案4】:

从右到左可能会更好。这对我有用:

const std::string& replacestring( std::string& strString, const std::string& strOld, const std::string& strNew )

    for ( int nReplace = strString.rfind( strOld ); nReplace != std::string::npos; nReplace = strString.rfind( strOld, nReplace - 1 ) )
    
        strString.replace( nReplace, strOld.length(), strNew );
        if ( nReplace == 0 )
            break;
    
    return strString;

【讨论】:

从右到左没有区别,除非是意外。

以上是关于C ++查找和替换功能的单引号问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:如何在表数据中用单引号查找和替换多引号

C语言中啥是字符,啥是字符串啊,谢谢

Java Regex:查找带转义的单引号文本

如何使用 sed 在 shell 脚本中添加单引号

C语言中,字符与字符串的区别是啥?(详细点)

VS Code 使用正则表达式跨文件查找和替换以纠正出现在特定行上的引号数量错误