3

这是我必须制作的一个非常简单的程序,但我对如何做却一无所知。

基本上,用户在 from 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
4

3 回答 3

7

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

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

于 2013-08-03T09:18:25.773 回答
4

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

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

请注意,其中的字段struct tm具有“奇怪”的语义——这就是整数偏移量如此应用的原因。哦,好吧,把那记在历史上。

现在不仅可以打印零件,还可以将结构传递给其他函数,如strftime,mktime等。

于 2013-08-03T09:15:56.007 回答
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;
}
于 2013-08-03T09:18:17.160 回答