0

Не выходит нормально проинициализировать квадратную матрицу, Значения вводятся в формате: на каждой строке значения для i ой строки матрицы через пробел, код вроде должен был корректно все сделать, но последний элемент строки почему - то не записывается. Подправьте если кто видит ошибку в коде, или подскажите может другой более человеческий способ инициализации. спасибо

int main(int argc, char * argv[])
{   
  size_t N;
  char values[100];     
  cin >> N;

  vector< vector<int> > Matrix(N);
  for ( int i = 0; i != N; ++i ) Matrix[i] = vector<int>(N);

  for (int i = 0; i != N; ++i)
  {     
      do { fflush(stdin); cin.getline(values, sizeof(values)); }
      while( !values[0] );

      for ( int j = 0; j < strlen(values); ++j )
      {
          if ( j == N ) break;

          if ( values[j] != 32 ) {
              Matrix[i][j] = values[j] - '0';   
          } 
      }
  }

  cout << endl;
  for (int i = 0; i != N; ++i)
  {
      for ( int j = 0; j != N; ++j )
          cout << Matrix[i][j] << ' ';

      cout << endl;
  }

  return 0;

}

1
  • 1
    values[j] - '0' Ну я вас прошу =( Есть же кошерный atoi(), зачем такие грязные хаки?
    – free_ze
    22 июл 2014 в 9:15

1 ответ 1

4

Зачем таке извращения? Поток стандартного воода (cin) отлично умеет читать отдельные числа, разделённые пробелами, табами и переводами строки. Тем более, что ваша программа не будет работать с двух- и более значными числами, а чтение через поток стандартного ввода отлично с этим справляется.

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        cin >> Matrix[i][j];
    }
}

http://ideone.com/Q1Oq9Q

Всё! Никаких извращений с парсингом строки и поддержка многозначных чисел из коробки!

P. S. Кто научил вас так писать условие в цикле for? i != N потенциально ведёт к зацикливанию. Если вам, например, нужно будет осуществлять какие-то действия со счётчиком в теле цикла, вы можете легко проскочить значение i = N, и выполнить цикл ещё несколько лишних миллиардов раз или даже выполнять его бесконечно.

2
  • да, можно было легче, а по поводу условия i != N в цикле, тут разницы нету если поведение счетчика в цикле не изменять
    – ampawd
    22 июл 2014 в 9:53
  • В такой программе, которую можно окинуть одним взглядом - нету. И пока Вы не будете слушать, что Вам умные люди говорят, будет писать только такие программы. Погуглите какой-нибудь code guide. Во многих из них прямо говорится, как оформлять циклы, например, прохода по массиву. В большом проекте важны надежность и единообразие решений. 22 июл 2014 в 14:13

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.