我需要实现等效于expandtabs()函数的C ++。有人可以帮我将这段代码转换为C ++吗?
def expandtabs(string, n):
result = ""
pos = 0
for char in string:
if char == "\t":
# instead of the tab character, append the
# number of spaces to the next tab stop
char = " " * (n - pos % n)
pos = 0
elif char == "\n":
pos = 0
else:
pos += 1
result += char
return result
这就是我所拥有的:
std::string ExpandTabs(const std::string &str, int tabsize =4){
std::string ReturnString = str;
std::string result = " ";
int pos = 0;
for(std::string::size_type i = 0; i < ReturnString.size(); ++i) {
if (ReturnString[i] == '\t'){
int spaces = tabsize - pos % tabsize ;
ReturnString.append(" ", spaces);
pos = 0;
}
else{
pos+=1;
}
}
return ReturnString;
答案 0 :(得分:1)
您需要逐个字符地建立字符串。当前,您在函数的开头将str
分配给ReturnString
,然后将您认为必要的任何空格附加到字符串的末尾,而不是代替制表符。
毫无疑问,还有更多惯用的方法可以达到相同的结果,但是类似python的转换可能看起来像这样。
#include <iostream>
#include <string>
std::string expand_tabs(const std::string &str, int tabsize=4)
{
std::string result = "";
int pos = 0;
for(char c: str)
{
if(c == '\t')
{
// append the spaces here.
result.append(tabsize - pos % tabsize, ' ');
pos = 0;
} else
{
result += c;
pos = (c == '\n') ? 0: pos + 1;
}
}
return result;
}
int main()
{
std::cout << expand_tabs("i\tam\ta\tstring\twith\ttabs") << '\n';
std::cout << expand_tabs("1\t2\t3\t4", 2) << '\n';
}
基本上,它会逐步处理对所有非制表符到结果字符串的输入转发,否则,将为结果添加正确的空格数。
输出:
i am a string with tabs
1 2 3 4
答案 1 :(得分:0)
直接翻译python代码是有问题的,因为char
不能同时是字符串和单个字符,但除此之外,它很简单:
std::string expandtabs(std::string const&str, std::string::size_type tabsize=8)
{
std::string result;
std::string::size_type pos = 0
result.reserve(str.size()); // avoid re-allocations in case there are no tabs
for(c : str)
switch(c) {
default:
result += c;
++pos;
break;
case '\n':
result += c;
pos = 0;
break;
case '\t':
result.append(tabsize - pos % tabsize,' ');
pos = 0;
}
return result
}