2013-03-10 57 views
-8

我已經寫了一個代碼來打印2名工人的名字,但是卻打印出垃圾。cout corrupt char *

cout << "highest salary: " << highestSalary.getID() << " " << highestSalary.getName() << endl; 

cout << "hardest worker: " << mostHours.getID() << " " << mostHours.getName(); 

功能的getName()在工人類定義爲:

char* Worker::getName() 
{ 
    char temp[20]; 

    int i; 
    strcpy(temp, name); 

    return temp; 
} 

經歷這對我試圖把highestSalary.getName()的值A版本的char *臨時內部調試器,價值是我的預期,讓我們說「bob」,但在cout之後價值是「」,並且cout印刷垃圾。

+0

此行爲是SO未定義;) – 2013-03-10 13:11:49

+1

提示:'的std :: string'是極大的幫助,可以說,是必須做的一切字符。 – Zeta 2013-03-10 13:12:46

+7

爲什麼你不能friggin'谷歌呢?認真......這是每天兩次提問......難道你不能找到以前的問題之一嗎?爲什麼? *爲什麼?* ***爲什麼?*** – 2013-03-10 13:12:58

回答

1

您正在傳遞一個指向局部變量的指針。一旦你的函數結束,這個變量就消失了。

如果這是C++,你應該使用字符串類。如果因任何原因,你不這樣做,至少是const correct

const char* Worker::getName() const 
{ 
    return name; 
} 
+0

函數名稱後面的const表示此函數不會改變它所調用的類實例的狀態。 – nvoigt 2013-03-10 18:15:19

8

否否否,您正在返回一個指向本地函數變量的指針。這就是它崩潰的原因。

而是執行此操作:

std::string Worker::getName() 
{ 
    std::string temp(name); // not sure what type of name is... 
    return temp; 
} 

不要忘記#include<string>

現在你有了真正的C++,而不是C和指針。

+0

我是一名學生,還沒有學習字符串類。 – 2013-03-10 13:36:51