Использование std::stringstream для получения даты

Я пытаюсь получить дату из CLI. Однако сначала я получаю его как строку, потому что программа ведет себя неправильно, когда я ввожу какое-то недопустимое значение, например, строку при использовании std::cin ›› непосредственно в int. Вот мой код до сих пор, и он не ведет себя так, как ожидалось. После ввода даты в формате мм/дд/гггг по-прежнему отображается сообщение Мы не смогли интерпретировать ваш ввод. Вот мой код ниже, любая помощь будет принята с благодарностью:

  while (true)
{
      bool success = true;
      std::cout << "Enter the date added to inventory in the format mm/dd/yyyy: ";
      std::string mm, dd, yyyy;
      std::string temp;
      std::getline(std::cin,temp);
      for (int i=0; i<temp.size(); i++)
        {
          if ((temp[i]=='/') || (temp[i]='\\') || (temp[i] == '-'))
              temp[i] = ' ';
        }
      std::stringstream datestream(temp);
      datestream >> mm >> dd >> yyyy;
      try {
      date->month = static_cast<char>(std::stoi(mm.c_str()));
      date->day = static_cast<char>(std::stoi(dd.c_str()));
      date->year = static_cast<int>(std::stoi(yyyy.c_str()));
      } catch (std::invalid_argument e)
        {
          std::cout << "We could not interpret your input. \n";
          success = false;
        } catch (std::out_of_range e)
        {
          std::cout << "Your input was too large. Please try a smaller number a smaller number for dd, mm, and yyyy. \n";
          success = false;
        }
      if (success)
        break;
}

person Ansh Srivastava    schedule 02.02.2021    source источник
comment
Ваша ошибка здесь: (temp[i]='\\') это задание, а не сравнение. Сначала я этого не заметил, но понял это с помощью простого std::cout здесь: https://ideone.com/eTz6ld   -  person drescherjm    schedule 02.02.2021
comment
Большое спасибо. Сам бы я такое никогда не поймал.   -  person Ansh Srivastava    schedule 02.02.2021
comment
В качестве примечания: если вы описываете проблему с вводом и говорите, что ввели дату, это не очень полезно или описательно. Дата может быть любой. Практика быть кратким. Например, вместо этого вы можете указать точную дату, которую вы ввели.   -  person paddy    schedule 02.02.2021
comment
Мой совет, чтобы найти такие ошибки, — использовать cout, как я сделал в той ссылке ideone.com, или понять, как использовать отладчик. В конце концов, если вы станете профессиональным программистом, вам нужно будет очень хорошо уметь отлаживать.   -  person drescherjm    schedule 02.02.2021
comment
Спасибо за совет. Я должен был упомянуть мой точный вклад. Заявление cout было хорошей идеей. Всегда полезно перепроверить даже то, что я считаю тривиальным и простым. Со временем, когда я стану более опытным, я, надеюсь, научусь задавать вопросы по каждой мелочи во время отладки. Мне действительно нужно попрактиковаться в использовании отладчика. Большое спасибо за совет.   -  person Ansh Srivastava    schedule 02.02.2021
comment
Вы можете найти std::get_time полезным.   -  person Galik    schedule 02.02.2021
comment
Спасибо за предложение. На самом деле это был школьный проект, который требовал ввода данных пользователем, иначе я бы его использовал.   -  person Ansh Srivastava    schedule 02.02.2021


Ответы (1)


В вашем условии if вы назначаете // временному индексу i в строке 10. Пробел также назначается в 11-й строке временному индексу i. Я уверен, что это была просто опечатка, но в программировании двойной знак равенства является оператором сравнения, а один знак равенства — оператором присваивания.

person NevadaFlorenzo    schedule 02.02.2021
comment
Спасибо. Я изменил код, и он работает после изменения его с = на ==. Я намеревался использовать оператор сравнения == в строке 10. - person Ansh Srivastava; 02.02.2021