在Windows或Linux上运行时,功能的行为会有所不同

时间:2018-10-27 23:00:33

标签: c++ linux windows console codeblocks

我有一个简单的功能,可以将文本行打印到控制台的居中位置,并用'='符号填充空白空间。当我在Linux上用程序运行此功能时,我看到控制台窗口顶部的文本正确显示,随后是程序中的菜单提示符,但是在Windows上它什么也不会打印,而是直接跳到菜单提示符。这两个程序都使用带有-std = c ++ 11的GNU gcc进行编译并在代码块中运行。

void _print_center(vector<string>& tocenter)
{
    int center;
    for ( int x; x<static_cast<int>(tocenter.size());x++ )
    {
        char sfill = '=';
        string line = tocenter[x];
        center = (68/2)-(tocenter[x].length()/2);
        line.replace(0, 0, center, sfill);
        cout << std::left << std::setfill(sfill);
        cout << std::setw(68) << line << endl;
    }
}

1 个答案:

答案 0 :(得分:0)

您得到了问题的答案(未初始化的变量)。我建议您解开并简化代码,以免此类问题不那么频繁地出现。例如:

创建一个以单个字符串为中心的函数。

void center( std::ostream& os, const std::string& text, int width ) {
  if ( text.size() >= width ) {
    // Nothing to center, just print the text.
    os << text << std::endl;
  } else {
    // Total whitespace to pad.
    auto to_pad = width - text.size();
    // Pad half on the left
    auto left_padding = to_pad / 2;
    // And half on the right (account for uneven numbers)
    auto right_padding = to_pad - left_padding;

    // Print the concatenated strings. The string constructor will
    // correctly handle a padding of zero (it will print zero `=`).
    os << std::string( left_padding, '=' ) 
       << text
       << std::string( right_padding, '=' )
       << std::endl;
  }
}

一旦您测试了该函数对于单个字符串的效果很好,那么依靠C ++将其应用于字符串向量是很简单的:

void center( std::ostream& os,
             const std::vector< std::string >& strings,
             int width ) {
  for ( auto&& string : strings ) {
    center( os, string, width );
  }
}

是要使用std::string还是iomanip操纵器,还是std::setfill,要点还是一样:不要在同一函数中实现“迭代和格式化”。