我正在为基于Linux的操作系统构建一个简单的终端应用程序。这是一个简单的系统提取应用程序,应该打印在终端的一些系统信息,我想信息被围在一个矩形框。
为了实现这一点,我现在正在做这样的事情:
vector<string> fetch{}; // Declaring string vector that will hold the system info
const int rm{88}; // Characters to remove when computing paddings
fetch.push_back("╭─────────────────── System info ───────────────────╮");
// Define paddings
int total_len = fetch[0].length();
int model_pad = total_len - model().length() - rm;
fetch.push_back("│" + model() + string(model_pad, ' ') + "│"); // Add info about model to the vector
model()
函数返回一个包含计算机型号名称的字符串。这些只是一些示例行,但通常我将所有系统信息添加到vector中,并使用for循环将所有内容打印出来。
每行的想法是在系统信息后面添加尽可能多白色,以填充当前信息长度和框的一般长度之间的剩余空间,因此我可以在正确位置的末尾放置一条垂直线。
然而,正如你可能注意到的,我需要声明另一个变量rm
,它包含一些从原始“空白”长度中减去的任意整数值,因为如果没有它,末端的竖线将被放置在它们应该在的位置之后很远的地方。
这种行为在不同的终端模拟器中似乎是一致的,我不知道为什么会发生这种情况(如果你想知道,我发现了正确的rm
值,并进行了多次尝试和错误)。
我知道一般来说代码可能不是最优的,但我想知道为什么会发生这种奇怪的行为。
编辑:
- 操作系统:Manjaro Linux
- 编译器:g++ 12.2.1
1条答案
按热度按时间ccgok5k51#
std::string
不是字符串,而是字节串。它的length()
函数不是计算字符,而是计算字节。你正在使用的那些画线字符 * 可能 * 每个占用一个以上的字节,但是如果没有关于平台和编译器的进一步细节,就不可能确定。