创建一个字符串变量并要求在同一行输入?
Create a string variable and ask for input on the same line?
我绝对讨厌编程中这些不必要的步骤,在这些步骤中,您在一行中声明并分配一个变量,然后在下一行请求输入。
为了简短起见,我想创建一个变量并要求在同一行上输入所有内容。
目前我正在编写这样的代码:
string name = "";
cout << "Please enter your name: ";
cin >> name; //Too many steps for no reason
这是我的目标:
string name = cin >> name
显然,该行在 C++ 中不起作用,如果我闭上眼睛并掠夺它,它也不会起作用。
有什么小技巧吗?我的意思是在分配数组时可以使用 for 循环,那么为什么不在一行中声明和输入分配呢?
我知道 reader 会尝试跳出 window。 goto
证明了这个理论,是的,我自豪地使用它 :)
感谢任何帮助!
你可以尝试写一个模板函数,例如
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: ";
}
}
那么问题是什么?
如果您有重复代码(任何不必要的烦人),您只需将其包含在 function/method:
中
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");
yes I use it with pride :)
你真的不应该。学习编写具有最简单控制流程的优秀、易于阅读的小函数。另外,<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? ");
}
我绝对讨厌编程中这些不必要的步骤,在这些步骤中,您在一行中声明并分配一个变量,然后在下一行请求输入。
为了简短起见,我想创建一个变量并要求在同一行上输入所有内容。
目前我正在编写这样的代码:
string name = "";
cout << "Please enter your name: ";
cin >> name; //Too many steps for no reason
这是我的目标:
string name = cin >> name
显然,该行在 C++ 中不起作用,如果我闭上眼睛并掠夺它,它也不会起作用。
有什么小技巧吗?我的意思是在分配数组时可以使用 for 循环,那么为什么不在一行中声明和输入分配呢?
我知道 reader 会尝试跳出 window。 goto
证明了这个理论,是的,我自豪地使用它 :)
感谢任何帮助!
你可以尝试写一个模板函数,例如
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: ";
}
}
那么问题是什么? 如果您有重复代码(任何不必要的烦人),您只需将其包含在 function/method:
中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");
yes I use it with pride :)
你真的不应该。学习编写具有最简单控制流程的优秀、易于阅读的小函数。另外,<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? ");
}