我今天面临着一个简单而复杂的挑战。
在我的程序中,我希望每三个字符串插入一个-
个字符。这将如何实现?谢谢你的帮助。
#include <iostream>
int main()
{
std::string s = "thisisateststring";
// Desired output: thi-sis-ate-sts-tri-ng
std::cout << s << std::endl;
return 0;
}
答案 0 :(得分:2)
无需“构建新字符串”。
循环位置迭代,从3
开始,每次传递递增 4
,在指示的位置插入-
。当下一个插入点突破字符串时停止(每次传递都会增加一个字符串,因此需要跳过4
个插槽):
#include <iostream>
#include <string>
int main()
{
std::string s = "thisisateststring";
for (std::string::size_type i=3; i<s.size(); i+=4)
s.insert(i, 1, '-');
// Desired output: thi-sis-ate-sts-tri-ng
std::cout << s << std::endl;
return 0;
}
<强>输出强>
thi-sis-ate-sts-tri-ng
答案 1 :(得分:1)
一种通用(高效)的方法是通过在现有字符串上逐个字符地迭代来构建新字符串,随时进行任何所需的更改。在这种情况下,每隔三个字符就可以插入一个连字符:
use of deleted function 'std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator=(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]'
答案 2 :(得分:1)
只需取一个空字符串,并在每个可被3整除的计数中附加“ - ”
#include <iostream>
int main()
{
std::string s = "thisisateststring";
std::string res="";
int count=0;
for(int i=0;i<s.length();i++){
count++;
res+=s[i];
if(count%3==0){
res+="-";
}
}
std::cout << res << std::endl;
return 0;
}
输出
thi-sis-ate-sts-tri-ng
答案 3 :(得分:0)
简单。迭代字符串并构建一个新字符串
将旧字符串中的每个字符复制到新字符串中,每次复制3个字符时,都要添加额外的字符 - &#39; - &#39;到新字符串的末尾并重新开始复制字符的数量。
答案 4 :(得分:0)
与99%的文字问题一样,这个问题可以通过regular expression单行解决:
std::regex_replace(input, std::regex{".{3}"}, "$&-")
但是,它不会带来一个问题,而是两个新问题:
所以请三思而后行。
答案 5 :(得分:0)
您可以编写一个简单的仿函数来添加连字符,如下所示:
#include <iostream>
struct inserter
{
unsigned n = 0u;
void operator()(char c)
{
std::cout << c;
if (++n%3 == 0) std::cout << '-';
}
};
这可以传递给标准for_each()
算法:
#include <algorithm>
int main()
{
const std::string s = "thisisateststring";
std::for_each(s.begin(), s.end(), inserter());
std::cout << std::endl;
}
练习:扩展此类以使用不同的间隔,输出流,替换字符和字符串类型(窄或宽)。