gpt4 book ai didi

c++ - 如何获取字符串的显示宽度?

转载 作者:可可西里 更新时间:2023-11-01 18:38:46 27 4
gpt4 key购买 nike

当字符串中有非固定宽度的字符(如\t),或转义码,如用于 ANSI 颜色的字符(如 \1xb[31m),这些字符添加到 std::string.length(),但不添加到显示长度打印出来。

C++ 中有什么方法可以获取 *nix 中字符串的显示宽度吗?

例如:

displayed_width("a\tb") would be 4 if the displayed tab width is 2
displayed_width("\1xb[33mGREEN") would be 5

最佳答案

最常见的是,选项卡要求终端程序将光标移动到 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;
}

关于c++ - 如何获取字符串的显示宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com