c++ - 在这种情况下使用 cin 是正确的功能吗?

标签 c++ input getline cin

这是我的一小段代码:

int read_prompt() {
string prompt,fname,lname,input;
int id;
cout << "customers> ";

cin >> prompt;

if (prompt.compare("add") == 0) {
    cin >> id;
    cin >> fname;
    cin >> lname;
    NewCustomer(id,fname,lname);
} else if (prompt.compare("print")==0) {
    print_array();
} else if (prompt.compare("remove")==0) {
    cin >> id;
    RemoveCustomer(id);
} else if (prompt.compare("quit")==0) {
    return 0;
} else {
    cout << "Error!" << endl;
}
read_prompt();
return 0;

}

只要用户没有输入任何意外的内容,它就可以正常工作。该程序的测试用例之一应该传递输入“add 125mph Daffy Duck”,id 最终为 125,fname 等于 mph,lname 等于 Daffy。在这个函数接收到所有三个变量后,它再次调用自身并重新提示用户,然后输入哪个 Duck 哪个“错误!”明显得到输出。

我如何在用户输入时捕捉到这个错误? cin 是这方面最好的功能吗?我确实查找了 getline(),但我有点不确定如何实现它。

最佳答案

如果是我,

  • 我会立即读入整行并使用 std::istringstream 将其分解为以空格分隔的标记。
  • 我会不惜一切代价避免回避。
  • 我可能会添加更严格的错误检查。

像这样:

#include <vector>
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <sstream>
#include <stdexcept>

typedef std::vector<std::string> Args;

std::istream& operator>>(std::istream& is, Args& args) {
    std::string s;
    if(std::getline(is, s)) {
        std::istringstream iss(s);
        args.clear();
        while( iss >> s )
            args.push_back(s);
    }
    return is;
}

void NewCustomer(int, std::string, std::string) {
    std::cout << __func__ << "\n";
}
void RemoveCustomer(int) {
    std::cout << __func__ << "\n";
}
void print_array() {
    std::cout << __func__ << "\n";
}
int read_prompt() {
    Args args;
    while(std::cout << "customers> " && std::cin >> args) {
        try {
            if(args.at(0) == "add") {
                NewCustomer(
                    boost::lexical_cast<int>(args.at(1)),
                    args.at(2),
                    args.at(3));
            } else if (args.at(0) == "print") {
                print_array();
            } else if (args.at(0) == "remove") {
                RemoveCustomer(boost::lexical_cast<int>(args.at(1)));
            } else if (args.at(0) == "quit") {
                return 0;
            } else {
                throw 1;
            }
        } catch(boost::bad_lexical_cast&) {
            std::cout << "Error!\n";
        } catch(std::out_of_range&) {
            std::cout << "Error!\n";
        } catch(int) {
            std::cout << "Error!\n";
        }
    }
}

int main () {
    read_prompt();
}

关于c++ - 在这种情况下使用 cin 是正确的功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902268/

相关文章:

c++ - 如何将 std::for_each 与成员函数一起使用,其中提供的数据结构给出参数而不是对象

javascript - 计算js、html形式的输入文本

javascript - 使用 JavaScript 将输入发送到 url 并控制 iframe 直到提交?

c++ - 使用 getline 和 stringstream 检查句子中的单词是否在文件中

c++ - 在 C++ 中从文件导入 Level 5 MAT 文件格式数据

c++ - 为什么我无法创建流迭代器?

c++ - 测试字符串 vector 中的 int

c++ - C++中的getline是否只接受字符串类型?

c# - 用于检测 C# 和非托管 C++ 应用程序内存泄漏的工具

javascript - 长内容可编辑的 div 被鼠标水平滚动屏蔽为输入