我已经习惯了Python,现在我正在学习C++,这对我来说有点复杂。我如何修改输入,使其符合代码顶部注释中的描述?我试图包含if(input[0]!='.'&&…(,但它只返回0。我想把它作为号码的一部分。与输入的第一个字符后的字符相同。
我也不知道如何用逗号分隔三位数以上的数字(显然是从数字的末尾开始((所以1000000应该作为1000000返回(。
/*
* The first character can be a number, +, -, or a decimal point
* All other characters can be numeric, a comma or a decimal point
* Any commas must be in their proper location (ie, separating hundreds from thousands, from millions, etc)
* No commas after the decimal point
* Only one decimal point in the number
*
*/
#include <iostream>
#include <cmath>
#include <climits>
#include <string>
int ReadInt(std::string prompt);
int ReadInt(std::string prompt)
{
std::string input;
std::string convert;
bool isValid=true;
do {
isValid=true;
std::cout << prompt;
std::cin >> input;
if (input[0]!='.' && input[0]!='+' && input[0]!='-' && isdigit(input[0]) == 0) {
std::cout << "Error! Input was not an integer.n";
isValid=false;
}
else {
convert=input.substr(0,1);
}
long len=input.length();
for (long index=1; index < len && isValid==true; index++) {
if (input[index]==',') {
;
}
else if (isdigit(input[index]) == 0){
std::cout << "Error! Input was not an integer.n";
isValid=false;
}
else if (input[index] == '.') {
;
}
else {
convert += input.substr(index,1);
}
}
} while (isValid==false);
int returnValue=atoi(convert.c_str());
return returnValue;
}
int main()
{
int x=ReadInt("Enter a value: ");
std::cout << "Value entered was " << x << std::endl;
return 0;
}
编写解析代码很棘手。解析时,很容易将控制流弄得一团糟。我建议将I/O与验证代码分开:制作一个单独的函数bool IsVaildInt(const std::string& s)
,返回s
是否为有效输入,并在调用函数中进行外部提示。
它有助于系统地思考每个字符构成有效输入的内容。如果你熟悉正则表达式,就像cigien建议的那样,这可能是组织你的方法的好方法,即使你最终是手工编写解析代码,而不是使用正则表达式库。
以下是您发布的要求:
* The first character can be a number, +, -, or a decimal point
* All other characters can be numeric, a comma or a decimal point
* Any commas must be in their proper location (ie, separating hundreds
from thousands, from millions, etc)
* No commas after the decimal point
* Only one decimal point in the number
这有很多逻辑,但它是可行的。听起来你是在练习掌握C++基础知识,所以我不会发布任何代码。相反,这里有一个我将如何处理的大纲:
测试第一个字符是否为0-9、+、-或小数点。如果不是,则返回invalid。
搜索字符串是否有小数点。如果是,请记住它的位置。
从最后一个字符开始,以相反的方式循环其余字符。
与循环索引分离,制作一个计数器,说明当前数字的位置(…-1表示十分之一,0表示一,1表示十,2表示百,…(。如果字符串有小数点,请使用该小数点与字符串长度来确定最后一个字符的数字位置。
如果一个字符是逗号,请检查它与当前数字位置相比是否在有效位置。否则,返回无效。
否则,如果该字符是一个小数点,则它必须是前面识别的那个字符。如果不是,则表示有多个小数点,因此返回无效。
否则,字符必须是数字0-9,并且位数计数器应递增。如果字符不是数字,则返回无效。
最后,如果循环一直执行而没有遇到错误,则返回字符串是有效的。