【问题标题】:Replace space with an underscore用下划线替换空格
【发布时间】:2011-07-12 06:38:49
【问题描述】:

我正在尝试编写一些东西,将字符串中的所有空格替换为下划线。

到目前为止我所拥有的。

string space2underscore(string text)
{
    for(int i = 0; i < text.length(); i++)
    {
        if(text[i] == ' ')
            text[i] = '_';
    }
    return text;
}

如果我正在做类似的事情,这在大多数情况下都会起作用。

string word = "hello stackoverflow";
word = space2underscore(word);
cout << word;

这将输出“hello_stackoverflow”,这正是我想要的。

但是,如果我要做类似的事情

string word;
cin >> word;
word = space2underscore(word);
cout << word;

我只会得到第一个词,“你好”。

有人知道解决办法吗?

【问题讨论】:

    标签: c++ removing-whitespace


    【解决方案1】:

    您的getline 问题已解决,但我只想说标准库包含许多有用的功能。您可以这样做,而不是手动循环:

    std::string space2underscore(std::string text)
    {
        std::replace(text.begin(), text.end(), ' ', '_');
        return text;
    }
    

    这很有效,速度很快,而且它实际上表达了你在做什么。

    【讨论】:

    • 别忘了提到这需要头文件被包含在你的项目中。
    【解决方案2】:

    问题是cin &gt;&gt; word 只会读取第一个单词。如果你想一次操作一个整体,你应该使用std::getline。

    例如:

    std::string s;
    std::getline(std::cin, s);
    s = space2underscore(s);
    std::cout << s << std::endl;
    

    此外,您可能需要检查您是否真的能够阅读一行。你可以这样做:

    std::string s;
    if(std::getline(std::cin, s)) {
        s = space2underscore(s);
        std::cout << s << std::endl;
    }
    

    最后,作为旁注,您可能可以以更简洁的方式编写您的函数。我个人会这样写:

    std::string space2underscore(std::string text) {
        for(std::string::iterator it = text.begin(); it != text.end(); ++it) {
            if(*it == ' ') {
                *it = '_';
            }
        }
        return text;
    }
    

    或者对于奖励积分,使用std::transform!

    编辑: 如果您碰巧能够使用 c++0x 功能(我知道这是一个很大的假设),您可以使用 lambdas 和 std::transform,这会产生一些非常简单的代码:

    std::string s = "hello stackoverflow";
    std::transform(s.begin(), s.end(), s.begin(), [](char ch) {
        return ch == ' ' ? '_' : ch;
    });
    std::cout << s << std::endl;
    

    【讨论】:

    • 很抱歉学究了,但不管你是否使用std::,你都会混淆。 (虽然从技术上讲,您的代码与顶部的 using std::cout; 一起使用)
    • @Platinum Azure:你说得对,我个人喜欢使用明确的std::,但我在示例中复制了一些 OP 的代码。我会清理的。
    • 谢谢先生!我的程序现在运行良好:)
    • 我非常非常喜欢 lambda,但在这种情况下 std::replace 可能更合适。
    • @Blastfurnace:老实说,我完全忘记了std::replace,好电话!
    【解决方案3】:

    问题在于您对iostream 库中的std::cin 的理解:在以std::string 作为右侧参数的流上使用&gt;&gt; 运算符一次只需要一个单词(使用空格分隔)。

    您想要的是使用std::getline() 来获取您的字符串。

    【讨论】:

      【解决方案4】:

      对于现代 C++1x 方法,您可以选择 std::regex_replace。

      #include <regex>
      #include <string>
      #include <cstdlib>
      #include <iostream>
      
      using std::cout;
      using std::endl;
      using std::regex;
      using std::string;
      using std::regex_replace;
      
      int main( const int, const char** )
      {
         const auto target = regex{ " " };
         const auto replacement = string{ "_" };
         const auto value = string{ "hello stackoverflow" };
      
         cout << regex_replace( value, target, replacement ) << endl;
      
         return EXIT_SUCCESS;
      }
      

      优点:代码更少。

      缺点:正则表达式会混淆意图。

      【讨论】:

        【解决方案5】:

        替换

        cin >> word;
        

        有

        getline(cin, word);
        

        【讨论】:

          猜你喜欢
          • 2020-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 2013-11-08
          相关资源
          最近更新 更多