C++ 如何检查来自 Shell 的输入数
C++ How to check the number of the input from Shell
void test() {
int i ,j;
cout << "enter the i and j" << endl;
cin >> i >> j;
if (j <= 5 && j > 0 && i > 0 && i <= 9) {
cout << "right" <<endl;
} else {
cout << "error" << endl;
test();
}
}
int main(int argc, const char * argv[]) {
test();
}
如何检查命令行的输入是否完全正确?
下面是一些错误的测试,我们应该 运行 else
部分的代码。
foo ags
但是命令行中的结果是28行错误信息。
但我想要的只是一行代码 show "error"
有什么问题?
另一个
下面是我的 C++ 代码:
void test(int array[], int length) {
int index; // the index of heap array that human want to modify
int num; // the number of heap in the index position
cout << "input the index and num" << endl << flush;
string si,sj;
try{
cin >> si >> sj;
index = stoi(sj);
num = stoi(si);
}catch(std::exception e){
cout << "error, try again" << endl;
test(array, length);
}
if (index <= length && index > 0 && num > 0 && num <= array[index - 1]) {
array[index - 1] -= num;
// print(array, length);
} else {
cout << "error, try again" << endl;
test(array, length);
}
}
现在有一个shell到运行这段代码,但是在shell中,存在如下输入:
input the index and num 2 1
这是正确的
input the index and num 2
它只有 1 个值,程序阻塞在这里等待另一个输入,我应该弄清楚并输出 "error, try again"
input the index and num 1 2 3
这也是不正确的,因为有超过 2 个输入值。同样,我应该弄清楚并输出 "error, try again"
如何处理?
cin >> i >> j;
只是跳过前导空格,然后读取两个由空格分隔的格式化 int
值。如果您在示例中输入更多内容,则其余内容将保留在输入流缓冲区中。如果您再次调用 test()
,cin
从该缓冲区读取。
您可以使用 cin.ignore(numeric_limits<streamsize>::max())
来解决这个问题,因为它会清除缓冲区。
首先,您需要将输入读取为字符串,然后通过 std::stoi 检查错误将字符串转换为 int。假设你只需要 "error" 消息,使用 try-catch 块只捕获 std::exception 并输出 "error"。
其次,要在出现错误的情况下重复调用 test(),您需要使用某种 lopp 并且不要从 test() 内部调用 test()。这种技术称为递归调用,用于其他目的,而不是简单的重复。
我已将您的 test() 函数修改为 return bool 值,如果成功,它将 return true,如果出错,它将 return true,然后从 while() 循环中调用它,这将重复调用如果 returned 错误。
关于你的第二个问题,你需要分别输入数字,每个数字在不同的行。该程序将能够单独检查每个数字。见代码:
#include <string>
#include <iostream>
bool test() {
int i ,j;
std::string si,sj;
try{
cout << "enter i:" << endl;
cin >> si;
i = std::stoi(si);
cout << "enter j:" << endl;
cin >> sj;
j = std::stoi(sj);
}catch(std::exception e){
cout << "error";
return false;
}
if (j <= 5 && j > 0 && i > 0 && i <= 9) {
cout << "right" <<endl;
return true;
} else {
cout << "error" << endl;
return false;
}
}
int main(int argc, const char * argv[]) {
while(!test()){}
}
void test() {
int i ,j;
cout << "enter the i and j" << endl;
cin >> i >> j;
if (j <= 5 && j > 0 && i > 0 && i <= 9) {
cout << "right" <<endl;
} else {
cout << "error" << endl;
test();
}
}
int main(int argc, const char * argv[]) {
test();
}
如何检查命令行的输入是否完全正确?
下面是一些错误的测试,我们应该 运行 else
部分的代码。
foo ags
但是命令行中的结果是28行错误信息。 但我想要的只是一行代码 show "error"
有什么问题?
另一个
下面是我的 C++ 代码:
void test(int array[], int length) {
int index; // the index of heap array that human want to modify
int num; // the number of heap in the index position
cout << "input the index and num" << endl << flush;
string si,sj;
try{
cin >> si >> sj;
index = stoi(sj);
num = stoi(si);
}catch(std::exception e){
cout << "error, try again" << endl;
test(array, length);
}
if (index <= length && index > 0 && num > 0 && num <= array[index - 1]) {
array[index - 1] -= num;
// print(array, length);
} else {
cout << "error, try again" << endl;
test(array, length);
}
}
现在有一个shell到运行这段代码,但是在shell中,存在如下输入:
input the index and num 2 1
这是正确的
input the index and num 2
它只有 1 个值,程序阻塞在这里等待另一个输入,我应该弄清楚并输出 "error, try again"
input the index and num 1 2 3
这也是不正确的,因为有超过 2 个输入值。同样,我应该弄清楚并输出 "error, try again"
如何处理?
cin >> i >> j;
只是跳过前导空格,然后读取两个由空格分隔的格式化 int
值。如果您在示例中输入更多内容,则其余内容将保留在输入流缓冲区中。如果您再次调用 test()
,cin
从该缓冲区读取。
您可以使用 cin.ignore(numeric_limits<streamsize>::max())
来解决这个问题,因为它会清除缓冲区。
首先,您需要将输入读取为字符串,然后通过 std::stoi 检查错误将字符串转换为 int。假设你只需要 "error" 消息,使用 try-catch 块只捕获 std::exception 并输出 "error"。 其次,要在出现错误的情况下重复调用 test(),您需要使用某种 lopp 并且不要从 test() 内部调用 test()。这种技术称为递归调用,用于其他目的,而不是简单的重复。 我已将您的 test() 函数修改为 return bool 值,如果成功,它将 return true,如果出错,它将 return true,然后从 while() 循环中调用它,这将重复调用如果 returned 错误。 关于你的第二个问题,你需要分别输入数字,每个数字在不同的行。该程序将能够单独检查每个数字。见代码:
#include <string>
#include <iostream>
bool test() {
int i ,j;
std::string si,sj;
try{
cout << "enter i:" << endl;
cin >> si;
i = std::stoi(si);
cout << "enter j:" << endl;
cin >> sj;
j = std::stoi(sj);
}catch(std::exception e){
cout << "error";
return false;
}
if (j <= 5 && j > 0 && i > 0 && i <= 9) {
cout << "right" <<endl;
return true;
} else {
cout << "error" << endl;
return false;
}
}
int main(int argc, const char * argv[]) {
while(!test()){}
}