2014-05-04 39 views
0

我知道這也許這樣一個奇怪的問題,但它stucks我前兩天。我的助手是顯示學生的信息並使用STRUCT類型更新它們。這是我的作品:字符dispaying

#include <iostream> 

using namespace std; 

struct DATE 
{ 
int day; 
int month; 
int year; 
}; 

struct STUDENT{ 
char ID[8]; 
char name[50]; 
DATE birthday; 
char address[100]; 
float Math; 
float English; 
float CS; 
}; 


void inputClass(STUDENT* &list, int &n) 
{ 
cout << "Please enter the number of students: "; 
cin >> n; 
list = new STUDENT[n+1]; 
for(int i=1; i<=n; i++) 
{ 
cout << "Please enter the info of student " << i << endl; 

cout << "ID: "; 
cin >> (&list[i]) -> ID; //the same with "list[i].ID" 
fflush(stdin); 

cout << "Name: "; 
cin >> (&list[i]) -> name; 
fflush(stdin); 

cout << "Date of Birth\n"; 
cout << "Day: "; 
cin >> (&list[i]) -> birthday.day; 
fflush(stdin); 
cout << "Month: "; 
cin >> (&list[i]) -> birthday.month; 
fflush(stdin); 
cout << "Year: "; 
cin >> (&list[i]) -> birthday.year; 
fflush(stdin); 

cout << "Address: "; 
cin >> (&list[i]) -> address; 
fflush(stdin); 

cout << "Math result: "; 
cin >> (&list[i]) -> Math; 
fflush(stdin); 

cout << "English result: "; 
cin >> (&list[i]) -> English; 
fflush(stdin); 

cout << "CS result: "; 
cin >> (&list[i]) -> CS; 
fflush(stdin); 

cout << "************* Next Student *************\n" ; 
} 
} 

void updateScore(STUDENT* list, int n) 
{ 
cout << "Who do you want to update?" << endl; 
cout << "Ordinal Number(s): "; 
cin >> n; 
//Display outdated results 
cout << "Student's Name: " << (&list[n])-> name << endl; 
cout << "*********** Current Results ***********" << endl; 
cout << "Math: " << (&list[n]) -> Math << endl; 
cout << "English: " << (&list[n]) -> English << endl; 
cout << "CS: " << (&list[n]) -> CS << endl; 
//Update results 
cout << "Please update the results" << endl; 
cout << "Math result: "; 
cin >> (&list[n]) -> Math; 
fflush(stdin); 

cout << "English result: "; 
cin >> (&list[n]) -> English; 
fflush(stdin); 

cout << "CS result: "; 
cin >> (&list[]) -> CS; 
fflush(stdin); 


} 

void main() 
{ 
STUDENT* list; 
int n; 
inputClass(list, n); 

updateScore(list, n); 
} 

在「//顯示過時的結果」一節中,我用「COUT」打印出來的學生就根據他/她的序號名稱。但是,假設我想要得到全名:「John Smith」。然而,我所得到的僅僅是「約翰」。有什麼方法可以讓我獲得所有角色?

您的幫助和對我的英語不好對不起非常感謝,我是來自越南的學生。

+2

其實,你的英語相當不錯:) –

+3

你應該使用C++字符串,而不是C風格的字符串 –

+0

我完全同意馬丁,你的英語是遠離機器人一樣expre ssions我用.... – Manu343726

回答

1

使用std::getline<string>頭,具有std::string變量,而不是>>和原始字符陣列。

  • >>讀取由空格隔開字輸入的

  • 的原始字符數組不調整到需要的長度,你可能在緩衝區溢出未定義行爲。


順帶一提,許多/大多數程序員找到所有使用大寫礙眼;它傷害了眼睛。

此外,所有大寫是按照慣例(在C和C++)爲宏名稱保留。

+0

我覺得這是一個很好的點,以鼓勵使用'的std :: VECTOR'而不是原始動態數組了。我更喜歡首先獲得C++語言知識的人,然後轉到低級子集以瞭解這些神奇功能的實際工作方式。 – Manu343726

+1

你能證明我應該如何糾正我的代碼?因爲我對C++這樣的程序設計師來說真的很陌生:(...非常感謝您的支持 – Ben

+0

以及我可以「證明」,但我沒有選擇當我寫這個答案時,我認爲Google的能力是一項技能初學者可以從珩磨中受益,甚至有這樣一種說法:「給一個人一條魚,然後你喂他一天,教他如何去釣魚,然後你終生養活他」,或者正如我們曾經說過的, 「給一個男人一條烤魚,你喂他一天,讓他着火,並且你永遠免除了這個問題。」 –

1

由於它已經被先前回答,你應該使用std ::函數getline(請參閱本question)。

我假設你使用的是IDE,它通常爲我們用戶修復了很多事情,但是這可能會讓你的代碼在其他編譯器中不可編譯,所以你應該修改一些東西能處處編譯代碼:

平時要注意,如果你添加必要的包含。缺少包含stdin和fflush的聲明。您應該添加:

#include <csdtio> 

而且,主要應返回一個int,所以,它應該是類似

int main(int argc, char* argv[]){ /*Although you can usually omit the parameters*/ 
    // Code 

    return 0; 
} 

順便說一句,就像一個側面評論,你忘了標爲:

cout << "CS result: "; 
cin >> (&list[]) -> CS; 
+0

好吧,我使用VS2010,但是當我添加#包括正如你所說,它說「沒有這樣的文件或目錄」。也許我的代碼編譯器缺少一些東西,我有一天應該重新安裝它。 ...無論如何,感謝您的幫助。 – Ben

+0

不客氣。如果回答你的問題,不要忘記標記乾杯和他的答案已被接受。 –