C++ - 我如何误用 istringstream 忽略?
C++ - How am I misusing ignore with istringstream?
我计划在主代码中要求用户以 (800) 555-1212 的形式输入 phone 号码,这将被发送到我的 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: error: no match for call to ‘(const std::_Swallow_assign) ()’
iss >> std::ignore();
std::ignore()
的目的与您希望达到的目的截然不同。而不是
iss >> std::ignore();
使用
iss.ignore();
您可以在 https://en.cppreference.com/w/cpp/io/basic_istream/ignore 查看 std::istream::ignore()
的文档和示例用法。
std::ignore
并不像您想象的那样:它用于元组。
相反,您要查找的实际上是 std::istream::ignore()
。你会像这样使用它:
iss.ignore();
有关std::istream::ignore()
的更多信息,您可以阅读this question.
我计划在主代码中要求用户以 (800) 555-1212 的形式输入 phone 号码,这将被发送到我的 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: error: no match for call to ‘(const std::_Swallow_assign) ()’
iss >> std::ignore();
std::ignore()
的目的与您希望达到的目的截然不同。而不是
iss >> std::ignore();
使用
iss.ignore();
您可以在 https://en.cppreference.com/w/cpp/io/basic_istream/ignore 查看 std::istream::ignore()
的文档和示例用法。
std::ignore
并不像您想象的那样:它用于元组。
相反,您要查找的实际上是 std::istream::ignore()
。你会像这样使用它:
iss.ignore();
有关std::istream::ignore()
的更多信息,您可以阅读this question.