输入有效的双输入C ++

时间:2018-10-10 00:25:52

标签: c++

一段时间以来,我一直在试图使此正确。我终于放弃了,我需要帮助。因此,我想做的就是让用户为我提供只有一个小数点的有效双输入,例如-“ 12.1”。如果用户输入12.1.1,我希望程序重新开始直到提供有效的双输入。

谢谢!

#include <iostream>
#include <cctype>
#include <string>

using namespace std;

double ReadDouble(string prompt);

int main() {
    ReadDouble("Enter double: \n");

}

double ReadDouble(string prompt) {
    string input;
    bool done = false;
    do {
        cout << prompt;
        cin >> input;
        done = true;
        for (int i = 0; i < input.length(); i++) {
            int count = 0;
            if (isdigit(input[i]) == 0) {
                if (ispunct(input[i]) != 0) {
                    count++;
                    count > 1 ? done = false : done = true;
                } else {
                    done = false;
                }
            }
        }
    } while (done == false);

    double retVal = stod(input.c_str());
    cout << retVal << endl;
    return retVal;
}

2 个答案:

答案 0 :(得分:2)

我知道您想自己手动分析用户的输入,但是使用正则表达式可以简化此过程。这匹配任意数量的数字,可以选择是一个句点,然后是另一个可选数字。

#include <iostream>
#include <string>
#include <regex>

bool ValidateDouble(const std::string& str) {
  const std::basic_regex dbl (R"(^\d+\.?\d?$)");
  return std::regex_match(str, dbl);
}

double ReadDouble(const std::string& prompt) {
  std::string input;
  bool match = false;

  do {
    std::cout << prompt;
    std::getline(std::cin, input);
    match = ValidateDouble(input);
  } while (!match);

  return std::stod(input);
}

int main() {
  double d = ReadDouble("Enter double: ");
  std::cout << d << '\n';
}

答案 1 :(得分:0)

在您的代码中做了一些小改动,也许可以满足您的要求。 这是代码:

#include <iostream>
#include <cctype>
#include <string>
using namespace std;

double ReadDouble(string prompt);

int main() {
    ReadDouble("Enter double: \n");
}

double ReadDouble(string prompt) {
    string input;
    bool done = false;
    do {
        cout << prompt;
        cin >> input;
        done = false;
        int count = 0;
        for (int i = 0; i < input.length(); i++) {

            if (isdigit(input[i]) == 0) {
                if (ispunct(input[i]) != 0) {
                    count++;
                    continue;
                }
                else
                {
                    count++;
                    break;
                }
            }
            else
                continue;   
        }
        count > 1 ? done = false : done = true;

    } while (done == false);

    double retVal = stod(input.c_str());
    cout << retVal << endl;
    return retVal;
}

如果输入“ 12.1.1”,程序将要求您重新输入双精度字,直到输入正确的双精度字为止,也许是这样的:

Enter double:
12.1.1
Enter double:
12.1.33
Enter double:
12.1
12.1
press any key to continue. . .