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

Create a string variable and ask for input on the same line?

本文关键字:一行 输入 一个 字符串 变量 创建      更新时间:2023-10-16

我绝对讨厌这些不必要的步骤在您声明并在一行上分配变量并要求输入的这些不必要的步骤。

要保持简短,我想创建一个变量并要求在同一行上全部输入。

目前我正在写这样的代码:

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

这是我的目标:

string name = cin >> name

显然,如果我闭上眼睛和猎物使其工作。

有一个小技巧要这样做吗?我的意思是可以在分配数组时与for-loops一起工作,所以为什么不在一行上声明和输入评估呢?

我知道读者会尝试跳出窗口。 goto证明了这一理论,是的,我以自豪为:)

任何帮助!

您可以尝试编写模板功能,例如

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

并像

一样使用它
 auto x = read<int>();

如果您想验证用户输入(并且几乎可以肯定 do 想要在现实生活代码中),则可以使用E.G.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: ";
    }
}

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

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

是的,我以骄傲为:)

您真的不应该。学会编写良好,易于阅读的小功能,其中最简单的控制流。另外,<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? ");
}