C ++ Неисправность при разборе номера телефона с использованием istringstream и istringstream.ignore - PullRequest
0 голосов
/ 12 октября 2019

Сначала скажу, что отправка моего кода в жестко закодированной, отлично отформатированной строке работает нормально. Но когда пользователь вводит строку ввода, код анализирует areaCode, но завершается неудачно при разборе обмена. Вот мой .h

// PhoneNumber.h
#ifndef PHONENUMBER_H
#define PHONENUMBER_H

#include <string>

class PhoneNumber {
   private:
      short areaCode;
      short exchange;
      short line;
   public:
      PhoneNumber(std::string number);
      void setPhoneNumber(std::string number);
      std::string getPhoneNumber() const;
      void printPhoneNumber() const;
};
#endif

Вот моя реализация .cpp

// PhoneNumber.cpp
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <cctype>
#include <stdexcept>
#include "PhoneNumber.h"

PhoneNumber::PhoneNumber(std::string number) {
   setPhoneNumber(number);
}

void PhoneNumber::setPhoneNumber(std::string number) {
   int length = number.length();

   std::istringstream iss(number);
   int count = 0;
   while (!isdigit(number[count])) {
      count += 1;
      iss.ignore(1);
   }

   iss >> std::setw(3) >> areaCode;
   count += 3;

   while (!isdigit(number[count])) {
      count += 1;
      iss.ignore(1);
   }

   iss >> std::setw(3) >> exchange;
   count += 3;

   while (!isdigit(number[count])) {
      count += 1;
      iss.ignore(1);
   }

   if (length - count < 4) {
      throw std::invalid_argument("Something wrong with your phone number input");
   }
   else {
      iss >> std::setw(4) >> line;
   }

}

void PhoneNumber::printPhoneNumber() const {
   std::cout << "(" << areaCode << ") " << exchange << "-" << line;
}

А теперь мой короткий тестовый код.

// PhoneNumber testing
#include <iostream>
#include <string>
#include "PhoneNumber.h"

int main() {
   std::string p1;

   std::cout << "Enter phone number in format of (800) 555-1212: ";
   std::cin >> p1;

   PhoneNumber phone1(p1);
   phone1.printPhoneNumber();
   std::cout << std::endl;
}

Я пытался написатьмой код setPhoneNumber, чтобы он был устойчивым к ошибкам пользователя. Итак, первый вопрос: как мне заставить это работать с пользовательским вводом? Вторичный (не нужно отвечать), почему он работает с жестко закодированной строкой телефонного номера, а не с вводом пользователя?

1 Ответ

0 голосов
/ 12 октября 2019
std::cin >> p1;

будет считывать только первый пробел или возврат каретки. Таким образом, если пользователь вводит (800) 555-0123, вы будете читать только "(800)".

. Вам нужно

std::getline(std::cin, p1);

, чтобы прочитать ввод.

Причина этогоРабота с жестко закодированной строкой заключается в том, что на оператор присваивания строки это не влияет. Когда вы кодируете p1 = "(800) 555-0123";, p1 получает значение "(800) 555-0123"

...