2015-09-28 69 views
1

我有一堂課,學生。 它包含一個私人會員'dob' 我想將字符串dob設置爲適當的日期。 我應該驗證輸入,並且我試圖使用scanf來做這件事,但我不知道爲什麼我的輸出關閉。問題存儲日期C++

void Student::getBday(){ 
    int mm, dd, yyyy; 
    printf("Date of Birth?\n"); 
    scanf("%d/%d/%d", &mm, &dd, &yyyy); 
    dob = mm + '/' + dd + '/' + yyyy; 
} 

這是我的打印功能:

void Student::printStudent(){ 
    cout.flush(); 
    cout << endl; 
    cout << "Student: " << lastName << ", " << firstName << endl; 
    cout << "Student ID: " << ID << endl; 
    cout << "Gender: " << gender << endl; 
    cout << "Status: " << status << endl; 
    cout << "Date of Birth: " << dob << endl; 
    cout << "GPA: " << gpa << endl; 
    cout << endl; 
} 

我的輸出:

LastName? 
Bar 
FirstName? 
Foo 
Gender? 
M 
Status? 
Freshman 
Date of Birth? 
12/21/2012 
GPA? 
3.5 
ID? 
12345678 
12345678 

Student: Bar, Foo 
Student ID: 12345678 
Gender: M 
Status: Freshman 
Date of Birth: [ 
GPA: 3.5 

Press any key to continue . . . 

編輯:

終於得到它的工作。謝謝你的幫助。我選擇了這個答案,因爲它幫助我轉換,但每個人都幫助我理解我的連接問題。

+1

對於2015年9月28日,'mm +'/'' + dd +'/'+ yyyy'是2146.你可能想要在你的數字經過驗證後轉換爲字符串。 – molbdnilo

+0

@molbdnilo我很困惑,對不起。我需要做些什麼才能將日期存儲爲mm/dd/yyyy? – aaaa

+0

與問題無關,但請考慮閱讀https://en.wikipedia.org/wiki/ISO_8601並以國際標準格式(yyyy-mm-dd)存儲/提示日期,而不是混淆的mm/dd/yyyy (甚至是dd/mm/yyyy)格式。 – Andrew

回答

1

這是你使用scanf導致問題的方式。

它應該更類似於

... 
printf ("Date of Birth?"); 
scanf("%d/%d/%d", &mm, &dd, &yyyy); 
... 

編輯

這裏是sprinf(...)的例子

... 
int mm,dd,yyyy; 
char dob [50]; 
printf ("Date of Birth?"); 
scanf("%d/%d/%d", &mm, &dd, &yyyy); 
sprintf (dob, "%d/%d/%d", mm, dd, yyyy); 
... 
+0

我剛剛修改它說printf(「出生日期?\ n」);但是當我嘗試打印時,仍然沒有顯示完整的字符串。 – aaaa

+0

但是,您輸入的日期爲「121212」,您的功能需要準確的「12/12/12」。另外,如何定義「dob」?通常你應該使用sprinf(,...)從數字中獲取字符串。 – FFMG

+0

dob被定義爲字符串 – aaaa

1

嘗試#include <sstream>,然後設置dob這樣:std::ostringstream oss; oss << mm << '/' << dd << '/' << yyyy; dob = oss.str();。如果您希望它看起來更好,Google std::setwstd::setfill可將日/月號碼填充到2位數。

您也應該檢查輸入錯誤:

if (scanf("%d/%d/%d", &mm, &dd, &yyyy) != 3) 
{ 
    std::cerr << "twit! call that a date???\n"; 
    exit(1); 
} 

(如molbdnilo評論,你目前的問題是,你與一起加入之日起的部位提取號碼,然後將這些數字相加兩個'/'字符的ASCII值:相反,您需要連接這些值的字符串表示,這是字符串流的設計目的。)

+0

@aaaa:什麼私人會員? 'oss'可以是一個函數本地/自動變量;它只是像'dob'這樣的類成員,可以是私有的,受保護的或公共的,但顯然你希望它設置並從其他成員函數中使用它。你的其餘問題 - 我不明白你不瞭解我已經建議你這樣做。 –

+0

起初我以爲你建議讓我的私人成員'ostreamstring'類型。我用你的驗證,但我做了一個循環。你的回答很有幫助。我通過@Tony D去了sprintf路線 – aaaa