2011-11-29 46 views
5

给定一个包含制表符的C++ std::string变量,是否可以确定该字符串在“屏幕”上出现的长度?即:如何确定扩展了制表符的std :: string的(打印)长度?

std::string var = "\t\t\t"; 
std::cout << var.length();   // result: 3 
std::cout << printed_length(var); // result: 3*(# of spaces per tab) 
+0

我假设没有跨平台的解决方案。但不知道。无论如何指定你的目标操作系统 –

+7

除非您确切知道您的文本正在渲染的位置(然后渲染器会知道选项卡的宽度与空间相比),否则无法知道选项卡的宽度 –

+0

@the_drow:我目前正在使用MinGW GCC 3.4.5在Windows XP上使用MSYS。 –

回答

3

不容易。如果没有涉及“屏幕”的具体知识(实际上是软件驱动输出),这是不可能的,因为标签扩展变化非常大。有四种相当明显的可能性,基于固定扩展与扩展到多个东西,基于字符单元与其他固定测量(例如,对于比例字体)。还有更复杂的标准“智能标签”,其中一个标签的扩展可能取决于另一个标签。

在一个典型的“控制台”上,它将扩展8个字符的单元格。为了解决这个问题,你不仅需要计算标签,还要查看字符串中每个标签的位置。您还必须对字符串开头相对于制表位的位置做出一些假设(或提供参数)。底线:如果你想做这样的事情,你必须自己做,根据你的目标上的标签如何展开的知识。

3

我们将简化这个假设,即字符串中的文本是一行上的唯一文本,或者它是从一个制表符边界开始的。

每个制表符将根据之前的字符数扩展到不同数量的空格。

expansion_count = n_spaces - (current_count % n_spaces);