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

ASt*_*her 4 c++ string c++03 crysis

我正在为Crysis Wars游戏编写一个新的服务器 - 客户端网络.我有一个函数将字符串居中到控制台窗口中每行支持的字符数.该窗口适合113个字符,但我已将函数中的最大字符宽度设置111为适合文本.

这是我的功能:

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

这个功能来自我去年提出的一个问题,但我不确定我是否最终在过去的项目中使用它.

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

CryLogAlways(CenterText("   ____     ____      _ __      _  _  __").c_str());
CryLogAlways(CenterText("  /  _/__  / _(_)__  (_) /___ _( )| |/_/").c_str());
CryLogAlways(CenterText(" _/ // _ \\/ _/ / _ \\/ / __/ // //_>  <  ").c_str());
CryLogAlways(CenterText("/___/_//_/_//_/_//_/_/\\__/\\_, / /_/|_|  ").c_str());
CryLogAlways(CenterText("                         /___/          ").c_str());
Run Code Online (Sandbox Code Playgroud)

但输出是:

在此输入图像描述

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

在此输入图像描述

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

Rei*_*ica 8

您使用的是string不合格的类型.我假设你有一个using namespace std地方(反对最佳实践),这将string参考std::string.但显然情况并非如此,并且您将非限定名称string定义为某些内容(问题未显示内容),其行为类似于a std::string(即它具有.length().c_str()).但是,这个东西的构造函数参数似乎与那些相反std::string.

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

std::string Main::CenterText(std::string s)
{
    return std::string((111 - s.length()) / 2, ' ') + s; 
}
Run Code Online (Sandbox Code Playgroud)

这是为什么对std类型使用显式限定是一个非常好的主意的一个主要例子.