【问题标题】:Unexpected characters in console output控制台输出中出现意外字符
【发布时间】:2014-11-21 13:27:30
【问题描述】:

我正在为 Crysis Wars 游戏编写一个新的服务器-客户端网络。 我有一个函数可以将字符串集中到控制台窗口中每行支持的字符数。 该窗口可容纳 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());

但是输出是:

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

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

【问题讨论】:

  • CryLogAlways(CenterText("X").c_str()); 的输出是什么?
  • 如果那是CryString,他们已经颠倒了构造string的参数顺序:首先是值,然后是数量(而不是std::string)。字符 ' ' 是十进制的 32,对应于输出中 '#'characters 的数量。
  • @cybermonkey 您的函数使用名为string 的类型作为其参数和返回类型,在此函数中,您正在构造一个string - 这里,参数的顺序很重要。
  • 你能澄清一下string到底是什么吗?
  • @cybermonkey 是的,正如我们一直在说的那样:P

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


【解决方案1】:

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

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

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

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

【讨论】:

  • “这是一个很好的例子,说明为什么对 std 类型使用显式限定是一个非常好的主意。” 我宁愿假设 CryTek 故意使用 typedef CryString string利用这种不良做法:CryString 的界面看起来与std::string 非常相似,我敢打赌他们试图使其兼容。
  • 我一直提到这个,很好的答案,所以我奖励了一个赏金。将在 23 小时内奖励。
  • @ʎǝʞuoɯɹǝqʎɔ 谢谢;我很高兴它对您有所帮助。
【解决方案2】:

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

正如 cmets 中所指出的,对于您使用的字符串实现,参数是切换的。

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

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

它应该会更好。

【讨论】:

  • 不过,这是在正确的轨道上。编译器显然不将此代码与 'string (size_t n, char c);' 的 std::string 构造函数匹配但是 OP 使用字符串常量“X”进行了测试,得到了相同的结果,那么它怎么可能不是 std::string 呢?
  • @RichardSchwartz std::string 有一个构造函数,它首先获取重复次数,然后是要重复的字符。另一方面,CryString 首先将字符重复,然后是重复量。所以 Martze 倒退了。
  • 所以我犯了与问题相同的错误,但使用了参考版本。哇。不过已经修复了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多