C ++ - Как я неправильно использую игнорировать с istringstream? - PullRequest
0 голосов
/ 12 октября 2019

Я планирую в основном коде попросить пользователя ввести номер телефона в форме (800) 555-1212, который будет отправлен моему конструктору PhoneNumber, а затем отправлен setPhoneNumber для его разбивки, установки личных переменных и анализа дляошибки. Кроме того, я хотел написать свой код setPhoneNumber, чтобы он учитывал ошибки пользователя в исходном вводе. Мой код PhoneNumber.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);
      void printPhoneNumber() const;
};
#endif

А вот мой код PhoneNumber.cpp

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

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

void PhoneNumber::setPhoneNumber(std::string number) {
   bool areaCodeDone = false;
   bool exchangeDone = false;
   int length = number.length();

   std::istringstream iss(number);
   for (int i = 0; i < length; i++) {
      if (! areaCodeDone) {
         if (! std::isdigit(number[i])) {
            std::string str;
            iss >> std::ignore();
         }
         else {
            iss >> std::setw(3) >> areaCode;
            areaCodeDone = true;
         }
      }
      else if (! exchangeDone) {
         if (! std::isdigit(number[i])) {
            iss >> std::ignore();
         }
         else {
            iss >> std::setw(3) >> exchange;
            exchangeDone = true;
         }
      }
      else {
         if (! std::isdigit(number[i])) {
            iss >> std::ignore();
         }
         else {
            if (length - i < 4) {
               throw std::invalid_argument("Something wrong with phone number entry.");
            }
            else {
               iss >> std::setw(4) >> line;
            }
         }
      }
   }
}

Ошибки, которые я получаю, находятся в моих строках с std :: ignore, но я нене знаю, как я использую это неправильно. Ошибка компилятора g ++:

PhoneNumber.cpp: 23: 32: ошибка: нет совпадения для вызова '(const std :: _ Swallow_assign) ()'

iss >>std :: ignore ();

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

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

std::ignore() имеет совершенно другую цель, чем то, что вы надеетесь достичь. Вместо

iss >> std::ignore();

используйте

iss.ignore();

Документацию по std::istream::ignore() и пример использования можно посмотреть по адресу https://en.cppreference.com/w/cpp/io/basic_istream/ignore.

1 голос
/ 12 октября 2019

std::ignore не делает то, что вы думаете, он делает: он используется для кортежей.

Вместо этого то, что вы ищете, на самом деле называется std::istream::ignore(). Вместо этого вы можете использовать его следующим образом:

iss.ignore();

Для получения дополнительной информации по std::istream::ignore() вы можете прочитать этот вопрос.

...