如何在C ++中验证输入并将其转换为单个数字(int)?

时间:2017-08-15 22:23:41

标签: c++

我正在学习C ++,这是我的代码:

int val1,val2;
char op;
cout << "Please enter a calculation (operand operator operand):";
cin >> val1 >> op >> val2;
if((val1<0||val1>9)||(val2<0||val2>9)) {
    cout << "Operand must be between 0 and 10!" << endl;
}
cout << "val1: " << val1 << "  val2: " << val2 << endl;

验证有效,但如果我输入例如34 + 56,我仍然不仅在变量val1或val2中有一个数字。

我想最终得到一个2位数或更多位数的错误消息,我想在变量val1和val2中只有一位数。

我尝试使用字符,字符串和isdigit(),但我仍然在黑暗中。谢谢你的帮助!!

3 个答案:

答案 0 :(得分:0)

#include <iostream>
#include <string>
int main(){
    int x = 100;
    std::cout <<  std::to_string(x)[0] - '0';

}
好的,没关系。数字的第一个数字。我有c ++ 11解决方案。 编译时添加编译器标志-std=c++11

答案 1 :(得分:0)

首先,我建议单独输入您的输入,因为这会大大降低代码的复杂性。

您遇到的问题是,在单独阅读时,您在编写34+56处理3次时,所有输入都一次 34 + 56(因为空间)。

因此,您需要做的是阅读整行:

std::cout << "Please enter a calculation:";
std::string str;
std::getline (std::cin, str);

然后,您需要找到符号并将字符串分割到那里:

// "34+56"
std::size_t index = str.find_first_of("+-/*");    // returns the index 2
std::string operand1 = str.substr(0, index);      // "34"
std::string operand2 = str.substr(index + 1);     // "56"

最后,您可以输出

  

对于数字的错误消息,该数字具有2位或更多位数且在变量val1和val2中只有一位数。

// converts string -> int
int val1 = atoi(operand1.c_str());
int val2 = atoi(operand1.c_str());

// check if in range
if( (val1<0||val1>9) || (val2<0||val2>9) ) {
    std::cout << "Operand must be between 0 and 10!" << std::endl;
    std::cout << "Using first digit of operands..."  << std::endl;

    //Edit(wrong operation): Use the leftmost character minus character '0'
    val1 = operand1[0] - '0';  
    val2 = operand2[0] - '0'; 
}

注意:我实际上没有对此进行测试。在许多情况下,这将失败(有多个操作)。您还可以争辩说找到第一个有效字符并保存它更有效,但我发现将整个操作数提取为字符串更清晰。

答案 2 :(得分:0)

解决这个问题:

while(true) {
    cout << "Please enter a calculation (operand operator operand):" << endl;
    while(true) {
        cin >> val1 >> op >> val2;
        if((val1<0||val1>9)||(val2<0||val2>9)) {
            cout << "Wrong input!  Try again." << endl;
            break;
        }
        cout << "val1: " << val1 << "  val2: " << val2 << endl;
    }
}

似乎是最明显的解决方案。 Thxalot !!