创建一个字符串变量,并要求在同一行上输入?

时间:2019-03-01 14:34:36

标签: c++ variables input cin variable-declaration

我绝对讨厌编程中的这些不必要的步骤,在这些步骤中,您在一行上声明并分配一个变量,然后在下一行要求输入。

为了简短起见,我想创建一个变量并要求在同一行中全部输入。

目前,我正在编写如下代码:

string name = "";
cout << "Please enter your name: ";
cin >> name; //Too many steps for no reason

这有点是我的目标:

string name = cin >> name

很明显,这行代码在C ++中不起作用,如果我闭上眼睛并捕食它,它也不会起作用。

有一个小技巧可以做到吗?我的意思是在分配数组时可以使用for循环,为什么不在一行上声明和输入赋值呢?

我知道读者会尝试跳出窗口。 goto证明了理论,是的,我很自豪地使用了它:)

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:6)

您可以尝试编写模板函数,例如

template <typename T>
T read (std::istream & in = std::cin)
{
    T x; in >> x; return x;
}

并像使用它

 auto x = read<int>();

如果您想验证用户输入(几乎可以肯定 要做 希望在实际代码中使用它),则可以使用例如std::optional

template <typename T>
std::optional<T> read (std::istream & in = std::cin)
{
    T x; in >> x; return in ? x : std::nullopt;
}

template <typename T>
T read_loop (std::istream & in = std::cin)
{
    while (true)
    {
        auto input = read<T>(in);
        if (input) return *input;
        in.clear();
        std::cout << "try again: ";
    }
}

答案 1 :(得分:3)

那是什么问题? 如果您有重复的代码(任何不必要的烦人),只需将其包含在函数/方法中:

template<typename T>
auto consoleInput(std::string_view request) -> T
{
    std::cin.sync();
    std::cout << request;
    T x;
    while(! (std::cin >> x)) {
        std::cin.clear();
        std::cin.ignore(200, '\n');
        std::cout << "\ntry again: " << request;
    }
    return x;
}

auto name = consoleInput<std::string>("Provide a name");

https://wandbox.org/permlink/iUWmrMCbCWGjoiGu

答案 2 :(得分:2)

  

是的,我很自豪地使用它:)

您真的不应该。学习编写具有良好控制,简单流程的良好,易读,小型函数。另外,<algorithm>


您可以通过将变量初始化为函数的步骤来实现:

template<typename T>
auto ask_user(std::string_view message) -> T {
    std::cout << message;
    T value;
    std::cin >> value;
    return value;
}

现在,您可以像这样进行输入:

int main() {
    auto name = ask_user<std::string>("What's your name? ");
}