【问题标题】:date structure in turbo c++Turbo C ++中的日期结构
【发布时间】:2017-04-22 07:14:43
【问题描述】:

我被要求在库函数getdate的帮助下编写一个显示系统当前日期的程序,getdate用系统当前日期填充日期结构*datep。 Turbo c++中预定义的日期结构如下所示。

struct date {
int da_year;    /*current year */
char da_day;    /* day of the month */
char da_mon;    /* month (1=Jan) */
};

函数getdate在头文件DOS.H中有如下声明。

void gatdate(struct date *datep);

由于getdate用系统当前日期填充日期结构*datep,我需要制作一个struct date类型的结构变量,调用getdate函数并将变量的地址作为实际参数传递给getdate,然后显示这个结构变量的值应该给我们系统的当前日期。 结构 date 有一个字符变量 da_day 作为它的成员之一来存储系统当前日期的日期。

  • 我的问题是如何存储天数(从 1-28/29/30/31 通常)在字符变量中?

  • 另外,按以下方式打印结构变量的值
    没有正确给出系统的当前日期。

    printf("year/day/month is %d/%c/%c",a.da_year,da_day,da_mon);    /*    a is the structure variable of the type struct date    */
    

    而下面的陈述给出了正确的日期。

    printf("year/day/month is %d/%d/%d",a.da_year,da_day,da_mon);
    

    为什么会这样?

【问题讨论】:

  • 如果您使用的是 c++,请将其标记为 c++。不是C
  • 不要在 2017 中使用 TurboC++。使用一些符合C++11 的免费软件编译器(例如最近的GCCClang...)。 TurboC++ 会教你过时的习惯(以及一些今天不值得学习的过时版本的 C++)。
  • 顺便说一句,在 C++ 中,您更喜欢使用 stream 输出,而不是 printf

标签: c++ function printf structure format-specifiers


【解决方案1】:

我的问题是如何将月份中的天数(通常是 1-28/29/30/31)存储在字符变量中?

char 变量,有符号或无符号,可以很容易地保存一个介于 031 之间的“值”(十进制值,有点迂腐),用作 日期 .

另外,打印结构变量的值如下 没有正确给出系统的当前日期。

是的,因为您没有打印 十进制 值,所以您正在尝试打印不期望的相应字符表示。我们只对那里的十进制值感兴趣,所以%d 将是预期的转换说明符。


更详细地说,对于像printf() 这样的可变参数函数,提供的参数经过默认参数提升 note,这使得提供的char 被提升为@987654327 @ 非常适合 %d 转换说明符。

也相关,引用C11,第 7.21.6.1 章,

d,i

int 参数被转换为 [−]dddd 样式的有符号十进制。 [....]

c

如果不存在 l 长度修饰符,则 int 参数将转换为 unsigned char,然后写入生成的字符。 [....]


注意:

引用C11,第 6.5.2.2 章

[....] 函数原型声明器中的省略号表示 参数类型转换在最后一个声明的参数之后停止。默认参数 提升是在尾随参数上执行的。

【讨论】:

  • 可能值得一提的是,当您将char 传递给像printf 这样的可变参数函数时,它无论如何都会隐式转换为int(参见“默认参数提升”)标准),所以%d 是双重合适的。事实上,正是因为这个原因,%c 实际上总是一个错误。
  • @CodyGray 非常正确,我们有%hhd%hhu 和其他chars。 :) 我会补充的。
  • 我们在现代 C++ 编译器中这样做,但我不记得在 Turbo C++ 中是否存在这种情况。 (可能是因为我太年轻了,还没有真正使用过 Turbo C++。)
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多