Функция работает по-разному при запуске в Windows или Linux - PullRequest
0 голосов
/ 28 октября 2018

У меня есть простая функция, которая печатает строки текста на консоли, по центру, с пустым пространством, заполненным знаком '='.Когда я запускаю эту функцию с моей программой в Linux, я вижу текст, отображаемый правильно в верхней части окна консоли, за которым следует подсказка меню из моей программы, но в Windows она ничего не печатает и пропускает прямо в подсказку меню.Обе программы компилируются и запускаются в кодовых блоках с использованием GNU GCC с -std = c ++ 11.

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 голосов
/ 28 октября 2018

Вы получили ответ на свой вопрос (неинициализированные переменные).Я рекомендую вам распутать и упростить свой код, чтобы проблемы такого рода не возникали так часто.Например:

Создайте функцию, которая центрирует одну строку.

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, точка остается неизменной: не реализуйте "итерацию и форматирование"в той же функции.

...