我正在尝试编写一些用下划线替换字符串中所有空格的东西。
到目前为止我所拥有的。
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;
我会得到第一个字,“你好”。
有人知道解决这个问题吗?
答案 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);