2016-10-13 1 views
0

Я занимаюсь созданием функций, которые берут строку в виде данных, которые выглядят примерно так: «D. Smith, 87, 65, 98, 87 , 92 ", а затем анализирует строку в запятых и присваивает значения переменным: string name, int score1, int score2, int score3, int score4 и int score5. Обратите внимание, что когда строка разбирается, первая часть строки (D. Smith) должна быть сохранена в виде строки, в то время как следующие части (87, 65, 98, 87, 92) должны быть сохранены как int. После взятия строки в качестве входных данных, вывод должен выглядеть следующим образом:Как разбирать строку, содержащую строку и 5 целых чисел без векторов C++

Name: D. Smith 

Score One: 87 

Score Two: 65 

Score Three: 98 

Score Four 87 

Score Five: 92 

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

Quarterback::Quarterback(string data) { 

    string Name; 
    int j = 0; 
    for (int i = 0; i < data.length(); i++) { 

     if (data[i] == ',') 
      j++; 
      while (j < 1){ 
       Name = Name + data[i]; 
      } 

     ..... 
    } 

Я нахожусь на правильном пути с этим мышлением? Любые предложения будут ценны!

ответ

0

Прежде чем дать вам решение, я дам вам несколько советов, чтобы вы могли подумать немного больше. Подумайте обо всех частях, где вам нужно разбить строку. Есть ,, правильно? Итак, просто проверьте запятую, как и вы, и если вы ее найдете, вы либо найдете строку, либо некоторые из целых чисел, которые следуют. В другом случае просто добавьте символ в некоторую временную строку, которая будет текущей партией.

0

Прежде всего, (поскольку вы используете стандартную библиотеку), вы должны действительно использовать итераторы. С их помощью вы можете «пометить» любую позицию в строке (и получить ее значение char), поэтому никакая память не будет потрачена впустую на временные строки, и вы можете иметь как можно больше из них (начало имени, конец имени, начало числа, конца номера, конца строки и т. д.). Они, конечно, поддерживают арифметику (добавление/вычитание, приращение/уменьшение, сравнение и т. Д.). И пару итераторов можно легко преобразовать в строку.

Во-вторых, вы должны использовать как многие из встроенных функций, как это возможно (например, std::find(...) найти запятые, пару итераторов для преобразования строки и т.д.), чтобы свести к минимуму возможных ошибок.

Последнее (но не менее важное): разделите сложную задачу на ряд простых подзадач (с C++ они имеют нулевую стоимость исполнения). В вашем случае это будет: найти следующую запятую, номер синтаксического анализа. Таким образом, ваш код должен выглядеть так:

Quarterback::Quarterback(string data) { 
    auto stringStart = data.cbegin(); 
    auto stringEnd = data.cend(); 

    auto nameStart = stringStart; 
    auto nameEnd = findNextComma(nameStart, stringEnd); 

    std::string name(nameStart, nameEnd); // easy as that :) 

    auto numberStart = nameEnd; 
    while (numberStart < stringEnd) { 
     auto numberEnd = findNextComma(numberStart + 2, stringEnd); // skip previous comma and space 
     int number = parseNumber(numberStart, numberEnd); // do whatever you need to do with an int 
     numberStart = numberEnd; 
    } 
} 

template <typename I> I findNextComma(I start, I end) { 
    ... 
} 
template <typename I> int parseNumber(I start, I end) { 
    ... 
} 
Смежные вопросы