C ++是否等同于python的expandtabs()函数?

时间:2019-10-08 23:12:56

标签: python c++

我需要实现等效于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;

2 个答案:

答案 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
}