C++ 无法使用 istringstream 和 istringstream.ignore 解析电话号码
C++ Trouble parsing telephone number using istringstream and istringstream.ignore
我首先要说的是,向我的代码发送一个硬编码的、格式完美的字符串效果很好。但是当让用户输入字符串时,代码解析了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 代码,使其能够容忍用户错误。所以第一个问题是如何使用用户输入进行这项工作?次要(不需要回答)为什么它适用于硬编码的电话号码字符串而不是用户输入?
std::cin >> p1;
只会读到第一个 space 或回车 return。因此,如果用户输入 (800) 555-0123
,您只会读取 "(800)"
.
你需要
std::getline(std::cin, p1);
读取输入。
它使用硬编码字符串的原因是字符串赋值运算符不受此影响。当您编码 p1 = "(800) 555-0123";
时,p1 设置为 "(800) 555-0123"
我首先要说的是,向我的代码发送一个硬编码的、格式完美的字符串效果很好。但是当让用户输入字符串时,代码解析了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 代码,使其能够容忍用户错误。所以第一个问题是如何使用用户输入进行这项工作?次要(不需要回答)为什么它适用于硬编码的电话号码字符串而不是用户输入?
std::cin >> p1;
只会读到第一个 space 或回车 return。因此,如果用户输入 (800) 555-0123
,您只会读取 "(800)"
.
你需要
std::getline(std::cin, p1);
读取输入。
它使用硬编码字符串的原因是字符串赋值运算符不受此影响。当您编码 p1 = "(800) 555-0123";
时,p1 设置为 "(800) 555-0123"