gpt4 book ai didi

C++在将输入值添加到数组之前验证输入值

转载 作者:行者123 更新时间:2023-11-28 01:51:12 25 4
gpt4 key购买 nike

我的目标是在将输入值添加到数组之前验证输入值。当前使用的代码:

int main()
{
int temp;
int arr[5];
for(int i = 0; i < 5; i++)
{
// validate here
cin >> arr[i];
}
return 0;
}

和我的验证方法:

int validateInput(string prompt)
{
int val;
while (true)
{
cin.clear();
cin.sync();
cout << prompt;
cin >> val;
if (cin.good() && val >= -50 && val <= 50)
{
break;
}
else
cin.clear();
cout << "Invalid input! number must be between -50 and 50" << endl;
}
return val;
}

这怎么可能?

最佳答案

您的 validateInput 应该只处理验证:它应该回答 "is x valid or not valid?"

bool validateInput(int x)
{
return val >= -50 && val <= 50;
}

stdin 读取时,使用 validateInput 并相应地分支:

for(int i = 0; i < 5; i++)
{
int temp;
cin >> temp;

if(cin.good() && validateInput(temp))
{
arr[i] = temp;
}
else
{
cout << "Invalid input! number must be between -50 and 50" << endl;
// handle invalid input
}
}

如果你想进一步抽象“只从 std::cin 读取有效数字”的想法,你可以使用一个高阶函数:

template <typename TFValid, typename TFInvalid, typename TFInvalidIO>
decltype(auto) processInput(TFValid&& f_valid, TFInvalid&& f_invalid, TFInvalidIO&& f_invalid_io)
{
int temp;
cin >> temp;

if(!cin.good())
{
// Invalid IO.
return std::forward<TFInvalidIO>(f_invalid_io)();
}

if(validateInput(temp))
{
// Valid IO and datum.
return std::forward<TFValid>(f_valid)(temp);
}

// Valid IO, but invalid datum.
return std::forward<TFInvalid>(f_invalid)(temp);
}

用法:

for(int i = 0; i < 5; i++)
{
processInput([&](int x){ arr[i] = x; },
[](int x){ cout << x << " is invalid"; },
[]{ cout << "Error reading from cin"; });
}

如果您想要更多的通用性,您还可以将 validateInput 和输入类型作为附加参数传递。

关于C++在将输入值添加到数组之前验证输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com