一段时间以来,我一直在试图使此正确。我终于放弃了,我需要帮助。因此,我想做的就是让用户为我提供只有一个小数点的有效双输入,例如-“ 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;
}
答案 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. . .