C ++ Разделение проблемы ввода - PullRequest
1 голос
/ 30 августа 2011

Мне дают ввод в виде:

(8,7,15)
(0,0,1) (0,3,2) (0,6,3)
(1,0,4) (1,1,5)
(2,1,6) (2,2,7) (2,5,8)
(3,0,9) (3,3,10) (3,4,11) (3,5,12)
(4,1,13) (4,4,14)
(7,6,15)

, где я должен запомнить количество троек.Я написал программу быстрого тестирования, чтобы попытаться прочитать входные данные из cin и затем разбить строку, чтобы получить числа из входных данных.Программа, кажется, не читает все строки, она останавливается после (1,1,5) и печатает случайное 7 после

Я создал эту функцию быстрого тестирования для одной из функций, для которых я пытаюсь создатьмое назначение:

int main ()
{
  string line;
  char * parse;

  while (getline(cin, line)) {

    char * writable = new char[line.size() + 1];
    copy (line.begin(), line.end(), writable);
    parse = strtok (writable," (,)");

    while (parse != NULL)
    {
      cout << parse << endl;
      parse = strtok (NULL," (,)");
      cout << parse << endl;
      parse = strtok (NULL," (,)");
      cout << parse << endl;
      parse = strtok (NULL," (,)");
    }

  }
  return 0;
}

Может ли кто-нибудь помочь мне исправить мой код или дать мне рабочий образец?

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Вы можете использовать эту простую функцию:

istream& read3(int& a, int& b, int& c, istream& stream = cin) {
    stream.ignore(INT_MAX, '(');
    stream >> a;
    stream.ignore(INT_MAX, ',');
    stream >> b;
    stream.ignore(INT_MAX, ',');
    stream >> c;
    stream.ignore(INT_MAX, ')');

    return stream;
 }

Ожидается, что поток начнется с (, поэтому он пропускает любые символы и останавливается после первого (, который он видит. Он читает в int в a, который передается по ссылке (поэтому это влияет на внешнюю a), а затем считывает и пропускает первую запятую, которую видит. Вымойте, промойте, повторите. Затем, после прочтения третьего int in, он пропускает закрывающий ), поэтому он готов сделать это снова.

Он также возвращает istream&, у которого operator bool перегружено, чтобы возвращать false, когда поток заканчивается, что и разрывает цикл while в примере.

Вы используете это так:

// don't forget the appropriate headers...
#include <iostream>
#include <sstream>
#include <string>

int a, b, c;

while (read3(a, b, c)) {
    cout << a << ' ' << b << ' ' << c << endl;
}

Это печатает:

8 7 15
0 0 1
0 3 2
0 6 3
1 0 4
1 1 5
2 1 6
2 2 7
2 5 8
3 0 9
3 3 10
3 4 11
3 5 12
4 1 13
4 4 14
7 6 15

Когда вы даете ему свой ввод.

Поскольку это задание, я оставляю вам добавить обработку ошибок и т. Д.

1 голос
/ 30 августа 2011

Я написал блог 9 дней назад именно для разбора таких входных данных:

И вы можете увидеть здесь вывод для вашего ввода: http://ideone.com/qr4DA

...