用下划线替换空格

时间:2011-03-09 21:50:03

标签: c++ removing-whitespace

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

到目前为止我所拥有的。

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;

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

有人知道解决这个问题吗?

5 个答案:

答案 0 :(得分:16)

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

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

这很有效,它很快,它实际上表达了你正在做的事情。

答案 1 :(得分:14)

问题是cin >> 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;

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

对于现代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;
}

优点:代码更少。

缺点:正则表达式可以实现云意图。

答案 4 :(得分:-1)

替换

cin >> word;

使用

getline(cin, word);