如果字符串中包含非固定宽度字符(例如\t
)或转义码(例如ANSI颜色的转义码(例如\1xb[31m
)),则这些字符会添加到{ {1}}的{1}},但在打印时不要添加到显示的长度。
C ++中是否有任何方法可以在* nix中显示字符串的宽度?
例如:
.length()
答案 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)
在什么设备上显示长度?一个使用固定宽度字体的控制台?使用比例字体的窗口?这是一个高度依赖于设备的问题。没有固定的答案。您必须使用与目标输出设备关联的工具。