如何显示字符串的宽度?

时间:2011-07-20 00:15:01

标签: c++ unix

如果字符串中包含非固定宽度字符(例如\t)或转义码(例如ANSI颜色的转义码(例如\1xb[31m)),则这些字符会添加到{ {1}}的{​​1}},但在打印时不要添加到显示的长度。

C ++中是否有任何方法可以在* nix中显示字符串的宽度?

例如:

.length()

4 个答案:

答案 0 :(得分:2)

最常见的是,选项卡要求终端程序将光标移动到8的倍数列,尽管许多终端程序允许您配置它。有了这样的行为,选项卡实际添加的宽度取决于光标相对于制表位预先确定的位置。因此,仅仅知道字符串内容不足以计算可打印的宽度,而无需对先前的光标放置和制表位进行一些假设或洞察。

不可打印的代码也因终端类型而异,但如果您只需要ANSI颜色,那么这很容易。你可以沿字符串计数字符移动;当您看到ESCAPE跳到终止m时。像(未经测试)的东西:

int displayed_width(const char* p)
{
    int result = 0;
    for ( ; *p; ++p)
    {
        if (p[0] == '\e' && p[1] == '[')
            while (*p != 'm')
                if (*p)
                    ++p;
                else
                    throw std::runtime_error("string terminates inside ANSI colour sequence");
        else
            ++result;
    }
    return result;
}

答案 1 :(得分:1)

没有内置。制表符的“显示宽度”是一个实现细节,控制台转义序列也是如此。 C ++并不关心特定于平台的事情。

你有什么特别想要的吗?如果我们知道您正在处理哪项特定任务,我们可能会建议替代方案。

答案 2 :(得分:0)

据我所知,不是标准方法。 C ++不了解终端。 我的猜测是使用NCURSES。不知道如果助推有什么东西可以提升。

答案 3 :(得分:0)

在什么设备上显示长度?一个使用固定宽度字体的控制台?使用比例字体的窗口?这是一个高度依赖于设备的问题。没有固定的答案。您必须使用与目标输出设备关联的工具。