4

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

这是我的功能:

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

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

我正在尝试在这种情况下使用此函数(该CryLogAlways函数只是将字符串记录到游戏/服务器日志文件并打印出来):

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

但是输出是:

在此处输入图像描述

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

在此处输入图像描述

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

4

2 回答 2

8

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

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

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

这是一个很好的例子,说明为什么对std类型使用显式限定是一个非常好的主意。

于 2014-11-21T14:38:44.460 回答
2

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

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

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

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

它应该工作得更好。

于 2014-11-21T13:53:20.350 回答