从用户输入获取mm dd yyyy

时间:2013-08-03 08:56:59

标签: c++ string

这是一个非常简单的程序我必须做,但我对如何做到这一点空白。

基本上用户在mm / dd / yyyy中输入日期,我所要做的就是将值分开并在不同的行上输出。

这是我到目前为止所做的:

int main ()
{
    char cMonth[2];
    char cDay [2];
    char cYear[4];

    cout << "Enter a date in the form mm/dd/yyy: " ;

    cin.get(cMonth,3,'/');
    cin.ignore(2,'/');
    cin.get(cDay, 4, '/');
    cin.ignore(2,'/');
    cin.get(cYear, 5);

    cout << cMonth << endl << cDay << endl << cYear << endl;
    return 0;
}

我的程序编译但是当它运行时它会输出错误的输出,例如,如果我输出04/13/2013输出将是:

0413
13
2013

3 个答案:

答案 0 :(得分:7)

问题是你的char缓冲区不足以容纳空终止符,因此你将空终止符写入缓冲区的末尾。在cMonthcDay的情况下,这显然会导致它们相互碰撞,因为它们相邻存储在堆栈中(不依赖于该行为!)

您需要使它们至少长一个字节,即3个,3个和5个字节长。请注意,您的代码容易受到缓冲区溢出的影响;您可能需要调整.get参数,以便它们不会溢出缓冲区,或者使缓冲区更长。

答案 1 :(得分:4)

另一种做这种事情的方法是简单地一次读取整个字符串,然后使用POSIX标准函数strptime()将其转换为包含这些部分的细分结构。像这样:

string in;
cin >> in; // TODO: check return value
struct tm out = {};
strptime(in.c_str(), "%m/%d/%Y", &result); // TODO: check return value
cout << out.tm_mon+1 << endl << out.tm_mday << endl << out.tm_year+1900 << endl;

请注意struct tm中的字段具有“奇怪”的语义 - 这就是为什么整数偏移被应用的原因。哦,好吧,粉笔那个历史。

现在,您不仅可以打印部件,还可以将结构传递给其他功能,例如strftimemktime等。

答案 2 :(得分:2)

试试这个:

int main ()
{
    char cMonth[3];
    char cDay [3];
    char cYear[5];

    cout << "Enter a date in the form mm/dd/yyyy: " ;

    cin.get(cMonth,3,'/');
    cin.ignore(2,'/');
    cin.get(cDay, 4, '/');
    cin.ignore(2,'/');
    cin.get(cYear, 5);

    cout << cMonth << endl << cDay << endl << cYear << endl;
    return 0;
}