2017-04-22 58 views
0

我被要求在庫函數getdate的幫助下生成一個顯示系統當前日期的程序,getdate用系統當前日期填充日期結構* datep。 Turbo C++中的預定義日期結構如下所示。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罷了,我需要的類型結構日期的結構變量,調用getdate函數並傳遞變量對於當前日期作爲地址實際的參數,然後顯示這個結構變量的值應該給我們系統的當前日期。 結構日期具有字符變量da_day作爲其成員之一來存儲系統當前日期的一天。

  • 這裏我的問題是如何可以存儲天數(從 1-28/29 /三十一分之三十零通常)本月在一個字符變量?

  • 此外,以低於
    的方式打印結構變量的值不會正確地給出系統的當前日期。

    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); 
    

    這是爲什麼?

+0

將此標記爲C++,如果您使用的是C++。不是C –

+0

**不要在* 2017 ***中使用TurboC++。使用一些符合免費軟件編譯器的[C++ 11](https://en.wikipedia.org/wiki/C%2B%2B11)(例如最近的[GCC](http://gcc.gnu.org/)或[鏘](http://clang.llvm.org/)...)。 TurboC++將教會你過時的習慣(以及一些過時的C++版本,它今天不值得學習)。 –

+0

順便說一句,在C++中,你更願意使用[stream](http://en.cppreference.com/w/cpp/io/basic_ostream)輸出,而不是'printf' –

回答

2

這裏我的問題是如何可以存儲天數(從1-28/29 /三十一分之三十零通常)本月在一個字符變量?

char變量,符號或無符號,可以很容易地保持一個「值」 0之間的範圍內,以31(十進制值,嚴格按照規範),以用作日期

此外,印刷結構變量低於 方式沒有價值正確地給出系統的當前日期。

是的,因爲你不是打印十進制值,你想打印預計不對應的字符表示。我們只對那裏的十進制值感興趣,所以%d將是預期的轉換說明符。


要精心,對於喜歡printf()可變參數的功能,所提供的參數進行默認參數推廣,這使得供應char晉升爲int這是%d轉換說明一個完美的結合。

而且相關,引述C11,章§7.21.6.1,

d,i

int參數轉換爲符號十進制的風格[ - ] dddd完整。 [....]

c

如果沒有l長度改性劑是目前,int參數被轉換爲一個 unsigned char,並將得到的字符被寫入。 [....]


注:

引用C11,章§6.5.2.2

[....]在一個函數原型說明符原因省略號記號 參數類型轉換在上次聲明的參數後停止。在結尾參數上執行默認參數 促銷。

+0

值得一提的是,當你傳遞一個char '到像'printf'這樣的可變參數函數,它無論如何都隱式轉換爲'int'(參見標準中的「默認參數促銷」),所以'%d'是雙倍合適的。事實上,正因如此,'%c'實際上總是一個錯誤。 –

+0

@CodyGray非常真實,我們有'%hhd'或'%hhu'等字符。 :)我會補充說。 –

+0

我們在現代C++編譯器中做的,但我不記得是否存在在Turbo C++中。 (可能是因爲我太年輕了,以至於沒有真正使用過Turbo C++。) –