限制用户只能在C++中输入实数

Restrict user to input real number only in C++

本文关键字:C++ 输入 实数 用户      更新时间:2023-10-16

如何限制用户只能在C++程序中输入实数?

示例:

双数;cin>>数;

并且它不会接受输入,比如:"12add"、"abcd"等…

有人能给我指引吗?使用bool值。谢谢

您不能强迫用户提供正确的输入。但是,如果先前的输入无效,您可以要求他们提供另一个输入。有不同的程序可以做到这一点。一个是:

  1. 使用getline读取一行
  2. 分析并理解该行
  3. 如果行无效,则向用户提供错误并转到1

这很正常,也很常见。不过它使用了动态内存。另一种选择是:

  1. 像往常一样使用cin >> value;
  2. 检查cin.fail()以查看输入是否正确读取(同时检查cin.eof()
  3. 如果失败,忽略所有输入,直到空白:

    char c;
    while (cin >> c)
        if (isspace(c))
            break;
    

这还有一个额外的优点,即在这样的错误输入中:

abc 12.14

你不会忽略整行,而只是忽略abc

我总是使用此代码来请求特定类型的输入(字符串和字符除外)。这个想法是请求任何数字类型,并使用字符串流来查看它是否可以存储为请求的类型,如果不能,它将一直提示用户,直到他输入请求的类型。

template <typename T> // will not work with strings or chars
T forceInputType_T() {
 T name;
 bool check = false;
 string temp;
 while (check == false) {
    cin >> temp;
    stringstream stream(temp);
    if (stream >> number) {
        check = true;
    } else {
    cout << "Invalid input type, try again..." << endl;
    }
}
return name;

}

如果你想使用布尔值,那么你可以检查字符串中的每个字符是否包含一个数字,而不是返回false,并通过循环不断要求有效的输入!

您不能限制用户在键盘上键入的内容。您可以将其接受为std::string,并使用boost::lexical_cast将其转换为您期望的数字类型,并捕获和处理boost::bad_lexical_cast异常。

您可以将数据检索为std::string,然后使用其中一个标准字符串转换函数来查看内容是否符合您的期望。

double number
if (cin >> number) {
    do_stuff_with(number);
} else {
    std::cerr << "That wasn't a number!";
}

查看sscanf函数。

不幸的是,您无法避免它…您可以接受字符串作为输入,并解析字符串(可能使用regex)以确保正确性。

您可以使用regex来解决

double inputNumber()
{
    string str;
    regex regex_double("-?[0-9]+.?[0-9]+");
    do
    {
        cout << "Input a positive number: ";
        cin >> str;
    }while(!regex_match(str,regex_double));
    return stod(str);
}

请记住,在标头中包含regex库。

使用此:

#include <conio.h>
#include <string>
#include <iostream>
using namespace std;
int main() {
    cout << "Input a positive whole integer: ";
    string currentInput;
    while (true) {
        char ch = getch();
        if (ch <= '9' and ch >= '0') cout << ch; currentInput += ch;
        // Handle other keys (like backspace, etc)
        else if (ch == 'r') cout << endl; break;
    }
}