控制台输出中出现意外的字符

时间:2014-11-21 13:27:30

标签: c++ string c++03 crysis

我正在为“孤岛危机”游戏编写一个新的服务器 - 客户端网络。 我有一个函数将字符串居中到控制台窗口中每行支持的字符数。 该窗口适合113个字符,但我已将函数中的最大字符宽度设置为111,以便很好地适应文本。

这是我的功能:

string Main::CenterText(string s)
{
    return string((111 - s.length()) / 2, ' ') + s; 
}

此功能来自question I asked last year,但我不确定我是否最终在过去的项目中使用

我试图在此上下文中使用此函数(CryLogAlways函数只是将字符串记录到游戏/服务器日志文件并打印出来):

CryLogAlways(CenterText("   ____     ____      _ __      _  _  __").c_str());
CryLogAlways(CenterText("  /  _/__  / _(_)__  (_) /___ _( )| |/_/").c_str());
CryLogAlways(CenterText(" _/ // _ \\/ _/ / _ \\/ / __/ // //_>  <  ").c_str());
CryLogAlways(CenterText("/___/_//_/_//_/_//_/_/\\__/\\_, / /_/|_|  ").c_str());
CryLogAlways(CenterText("                         /___/          ").c_str());

然而输出是:

enter image description here

同样,@ deW1请求,我有一个与CryLogAlways(CenterText("X").c_str());类似的输出:

enter image description here

为什么我会得到这个输出,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

您正在使用不合格的string类型。我假设您using namespace std位于某处(against best practice),这会使string引用std::string。但显然情况并非如此,并且您将非限定名称string定义为某些内容(问题并未显示内容),其行为类似于{{ 1}}(即它有std::string.length())。但是,此某些的构造函数参数似乎与.c_str()的构造函数参数相反。

如果您希望您的函数与标准库字符串一起使用,请明确地说:

std::string

这是一个很好的例子,说明为std::string Main::CenterText(std::string s) { return std::string((111 - s.length()) / 2, ' ') + s; } 类型使用显式资格是一个非常好的主意。

答案 1 :(得分:2)

根据C++ Reference,你是对的。

正如评论中所指出的,对于你使用的字符串实现,参数被切换。

对于第二个示例,您打印符号(111-1)/ 2 = 55 ='7'表示''= 32次。 将参数交换为

string(' ',(111 - s.length()) / 2)

它应该会更好。