使用get的c ++输入被替换为空格,数字不正确

时间:2017-07-19 03:49:08

标签: c++ input get

我正在制作一个程序,要求用户输入他们的出生日期,然后输出它。它使用异常类。但是,我似乎遇到的问题是输入以某种方式丢失或转换为不需要的数字。代码:

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

这个月发​​生了什么?

3 个答案:

答案 0 :(得分:0)

您对转换数字(类型char)使用非常奇怪的方法来表示数字(类型int)。

据我了解你的想法

 day = dayChar[0] * 10 + dayChar[1];

从两个字符int daydayChar[0]中为dayChar[1]创造价值。

这是错误的,必须像

 day = (dayChar[0] - '0') * 10 + (dayChar[1] - '0');

让我们看一下细节。字符串"12"有两个字符,代码为4950,只需检查:

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

正如所料。

<强>更新

其他一些需要改进的地方:

  1. 考虑使用atoi或其他标准转化函数从字符串中获取数字,例如day = atoi(dayChar);
  2. 注意像cin.get(yearChar, 04);这样的表达式 - 04是八进制数中的数字(数字lees与8不相关,但011等于9 in十进制)
  3. 同样关于cin.get(yearChar, 4); - 值4表示“字符串的大小”,因为我们知道类型char *的字符串需要一个额外的位置用于nul-terminator({ {1}})所以要获得\0我们需要大小4 + 1,即它必须是

    "1996"

    同样重要的是,数组cin.get(yearChar, 5); 的大小必须等于或大于5。

  4. 顺便说一下,如果您打算从评论中恢复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()作为建议herestd::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)

根据docscin.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++