C 从多行字符串中删除新行

新手上路,请多包涵

从 std::string 中删除“换行符”的最有效方法是什么?

原文由 shergill 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 753
2 个回答
#include <algorithm>
#include <string>

std::string str;

str.erase(std::remove(str.begin(), str.end(), '\n'), str.cend());

std::remove 的行为可能不是您所期望的。

调用 remove 之后通常会调用容器的擦除方法,该方法会擦除未指定的值并减小容器的物理大小以匹配其新的逻辑大小。

在这里 查看它的解释。

原文由 luke 发布,翻译遵循 CC BY-SA 4.0 许可协议

扩展 @Greg Hewgill 对 C++11 的回答

如果您只需要删除字符串末尾的换行符:

这在 C++98 中:

 if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}

…现在可以在 C++11 中这样完成:

 if (!s.empty() && s.back() == '\n') {
    s.pop_back();
}

(可选)将其包装在一个函数中。请注意,我在这里通过 ptr 简单地传递它,以便当您将其地址传递给函数时,它会提醒您字符串将在函数内部被 _修改_。

 void remove_trailing_newline(std::string* str)
{
    if (str->empty())
    {
        return;
    }

    if (str->back() == '\n')
    {
        str->pop_back();
    }
}

// usage
std::string str = "some string\n";
remove_trailing_newline(&str);

std::string 中删除“换行符”的最有效方法是什么?

最有效 的方式而言 - 我必须加快测试/配置文件并查看。我会看看是否可以回复您,并在此处的前两个答案之间运行一些速度测试,以及像我在这里所做的 C 风格的方式: Removing elements from array in C 。我将使用 我的 nanos() 时间戳功能 进行速度测试。

其他参考:

  1. 在此参考 wiki 中查看这些“新”C++11 函数: https ://en.cppreference.com/w/cpp/string/basic_string
  2. https://en.cppreference.com/w/cpp/string/basic_string/empty
  3. https://en.cppreference.com/w/cpp/string/basic_string/back
  4. https://en.cppreference.com/w/cpp/string/basic_string/pop_back

原文由 Gabriel Staples 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题