我正在制作一个程序,要求用户输入他们的出生日期,然后输出它。它使用异常类。但是,我似乎遇到的问题是输入以某种方式丢失或转换为不需要的数字。代码:
dob::dob() {
cout << "Enter your date of birth in format MM-DD-YYYY" << endl;
//cin.getline(monthChar, 10);
cin.get(monthChar, 10, '-');
cin.ignore();
cin.get(dayChar, 03, '-');
cin.ignore();
cin.get(yearChar, 04);
cout << dayChar[0];
cout << dayChar[1];
cout << monthChar[0];
cout << monthChar[1];
cout << " " << endl;
day = dayChar[0] * 10 + dayChar[1];
month = monthChar[0] * 10 + monthChar[1];
year = yearChar[0] * 1000 + yearChar[1] * 100 + yearChar[2] * 10 + yearChar[3];
cout << month << day << year;}
当输入12-12-1996输入时,我得到了 12 2 5054055270 输出。我看过this link 为了得到,似乎我正确地遵循了所有步骤,所以我想念我的错误。实际上,在撰写这篇文章的中途,我意识到为什么我最后得到了奇怪的数字,这是因为我将char值乘以10,但我如何转换为int?它只是char的static_cast吗? 我仍然需要回答为什么我在monthChar [0]的monthChar char被空格替换的原因。谢谢。
编辑:新代码:
dob::dob() {
cout << "Enter your date of birth in format MM-DD-YYYY" << endl;
//cin.getline(monthChar, 3);
cin.get(monthChar, 3, '-');
cin.ignore();
cin.get(dayChar, 3, '-');
cin.ignore();
cin.get(yearChar, 5);
cout << dayChar[0];
cout << dayChar[1];
cout << monthChar[0];
cout << monthChar[1];
cout << " " << endl;
day = (dayChar[0]-'0') * 10 + dayChar[1]-'0';
month = (monthChar[0] - '0') * 10 + monthChar[1] - '0';
year = (yearChar[0] - '0') * 1000 + (yearChar[1] - '0') * 100 + (yearChar[2] - '0') * 10 + yearChar[3] - '0';
cout << month << day << year;
}
当我使用答案/评论中的建议更新代码时,我得到正确的日期和年份而不是月份。对于输入05-27-1996,我得到输出
27 5
-45271996
这个月发生了什么?
答案 0 :(得分:0)
您对转换数字(类型char
)使用非常奇怪的方法来表示数字(类型int
)。
据我了解你的想法
day = dayChar[0] * 10 + dayChar[1];
从两个字符int day
和dayChar[0]
中为dayChar[1]
创造价值。
这是错误的,必须像
day = (dayChar[0] - '0') * 10 + (dayChar[1] - '0');
让我们看一下细节。字符串"12"
有两个字符,代码为49
和50
,只需检查:
cout << (int)dayChar[0] << endl;
cout << (int)dayChar[1] << endl;
所以表达
dayChar[0] * 10 + dayChar[1]
给出
49 * 10 + 50 = 540
因此,必须使用字符'0'
代码(48
)和表达式
(dayChar[0] - '0') * 10 + (dayChar[1] - '0')
将给出
(49 - 48) * 10 + (50 - 48) = 1 * 10 + 2 = 12
正如所料。
<强>更新强>
其他一些需要改进的地方:
atoi
或其他标准转化函数从字符串中获取数字,例如day = atoi(dayChar);
cin.get(yearChar, 04);
这样的表达式 - 04
是八进制数中的数字(数字lees与8不相关,但011
等于9
in十进制)同样关于cin.get(yearChar, 4);
- 值4
表示“字符串的大小”,因为我们知道类型char *
的字符串需要一个额外的位置用于nul-terminator({ {1}})所以要获得\0
我们需要大小4 + 1,即它必须是
"1996"
同样重要的是,数组cin.get(yearChar, 5);
的大小必须等于或大于5。
顺便说一下,如果您打算从评论中恢复yearChar
,请考虑以下代码段(使用cin.getline(monthChar, 10);
代替11
并使用10
用于字符串解析(这是C样式,只是为了显示可能的选项)):
sscanf
另外,对于使用char dataChar[11]; // at least 11 chars are required to store MM-DD-YYYY
int day, month, year;
int rescnt = 0; // will show how many numbers are extracted from text line
while(1){
cout << "Enter your date of birth in format MM-DD-YYYY" << endl;
cin.getline(dataChar, 11);
int rescnt = sscanf(dataChar, "%d-%d-%d", &month, &day, &year);
if (rescnt != 3)
{
cout << "Imput was wrong!" << endl;
cin.clear(); // reset state of cin
cin.ignore(INT_MAX, '\n'); // clean the input buffer
}
else
{
break;
}
}
// data is ready
cout << month << " " << day << " " << year << endl;
分隔符分割行(string
类型),您可以使用'-'
和std::string::substr()
作为建议here或std::string::find()
像here
stringstream
算法
答案 1 :(得分:0)
我对您的代码进行了一些更改,这很好用:
int startRadiusValue = 0;
int endRadiusValue = 10;
ObjectAnimator
.ofFloat(roundedGradientDrawable, "cornerRadius", startRadiusValue, endRadiusValue)
.setDuration(200)
.start();
为获得年份,您需要提供比年份大1的流量大小,即5.还要将整数转换为字符,您需要从每个字符中减去ASCII值'0',即48。
答案 2 :(得分:0)
根据docs,cin.get(char* s, streamsize n, char delim)
将从流中提取字符,直到提取了(n-1)个字符或遇到分隔字符。因此,假设输入字符串的格式为“MM-DD-YYYY”,即没有错误检查,您可以将代码更新为
std::cin.get(monthChar, 3, '-');
std::cin.ignore();
std::cin.get(dayChar, 3, '-');
std::cin.ignore();
std::cin.get(yearChar, 5);
std::cout << dayChar[0];
std::cout << dayChar[1];
std::cout << monthChar[0];
std::cout << monthChar[1];
std::cout << " " << std::endl;
auto day = (dayChar[0] - '0') * 10 + dayChar[1] - '0';
auto month = (monthChar[0] - '0') * 10 + monthChar[1] - '0';
auto year = (yearChar[0] - '0') * 1000 + (yearChar[1] - '0') * 100 + (yearChar[2] - '0') * 10 + yearChar[3] - '0';
std::cout << month << day << year;
从字符中减去'0'
会将ascii值转换为数字,请参阅Convert char to int in C and C++