2010-03-31 84 views
1

我必須定義一個接口。我的作業中的API如下所示:用於存儲值的函數參數

int generate_codes(char * ssn, char * student_id); 

int表示0或1表示合格或不合格。 studentid是一個輸出參數應該返回一個6位數的ID。 ssn是一個9位輸入參數

他們的學校計劃將採取ssn的和使用我的代碼來生成學生ID。

  1. 現在從API的角度來看,我不應該使用const char *作爲這兩個參數。
  2. 學生是否應該通過參考傳遞?而不是通過指針?
  3. 有人可以告訴我如何可以輕鬆地在我的測試應用程序中使用指針,它使用我的api獲取指針,以便它從char *打印std :: string?

我的應用程序的代碼看起來像

const char * ssn = "987098765" 
const char * studnt_id = new char [7]; 
int value = -1; 

value = generate_codes(ssn,studnt_id); 
std::string test(studnt_id); 
std::cout<<"student id= "<<test<<" Pass/fail= "<<value<<std::endl; 

delete [] studnt_id; 
return 0; 

我基本上得到一個錯誤約< <不是與操作數的右側兼容。當我將代碼更改爲

std::cout<<"student id= "<<test.c_str()<<" Pass/fail= "<<value<<std::endl; 

然後它的工作,但我得到垃圾的價值。不知道如何從指針獲取值。該函數內的值打印得很好。但是當我嘗試在打印垃圾的功能之外打印它時。裏面的上述功能,我設置了類似這樣

std::string str_studnt_id = studnt_id; 

這是一個字符串參數去我的,做的代碼生成真正的功能可按studndt_id。 當我準備的代碼,並想退貨我這樣做:

studnt_id = str_studnt_id.c_str(); 

應該是使str_studnt點的地址studnt_id的地址,因此任何改變我做的值,其指向它應該反映在外面的功能?這個API使用char *,但我的函數使用std :: string。

+0

該API指定的char *隱而不宣的事實你的意思是你不能改變那個界面。只是建議改變它。這避免了你必須包裝它,併爲非常簡單的事情創造不必要的複雜性。 – 2010-04-04 08:55:39

回答

1

那麼這個錯誤似乎很奇怪。你確定它是在正確的路線上,因爲它對我來說確實很好。至於你的功能。至於你的問題:

  1. 從C++ - 透視你應該使用const std::string &爲輸入參數和std::string &的輸出參數。這應該是這樣的:

    布爾generate_codes(常量的std :: string & SSN,的std :: string & student_id數據)

    的返回值應該是bool如果你想要表達的合格或不合格。

  2. 見我的答案爲1

  3. 你從const char *std::string的建築看起來OK,假設const char *真的是空值終止。

編輯再次閱讀你的問題,我建議你考慮一下改變指針和改變它指向價值之間的差異。

+0

的確我是。固定。 – 2010-03-31 23:19:54

0

函數內部的字符串變量被分配到堆棧中。當你從函數返回時,變量被銷燬,因此外界

東西垃圾值,你可以做會是這樣

void my_func(std::string* pmy_string) 
{ 
    std::string &my_string = *pmy_string; 
    // use my_string 
} 


string my_string; 

my_func(&my_string); 
+1

爲什麼不首先傳遞字符串作爲參考? – 2010-03-31 23:12:05

+0

這不是api所要求的。這意味着我認爲我可以做到這一點,但我仍然需要使用char *而不是std :: string。我只是不知道如何傳遞指針的地址與被銷燬的指針地址的副本,我正在失去一切。所以我怎麼會用char *來完成上述操作,然後將其轉換爲字符串,以便將其發送給我的內部函數? – djones2010 2010-04-01 20:34:29

-1

的char * student_id數據作爲指針是不會作爲輸出參數工作按價值傳遞,而不是參照。將它作爲char **傳遞會起作用。類似下面的(雖然它確實應該使用的std :: string,而不是字符*):

int generate_codes(char * ssn, char ** student_id) 
{ 
    *student_id = new char[2]; 
    (*student_id)[0] = 'Z'; 
    (*student_id)[1] = '\0'; 
    return 0; 
} 
+0

-1這是不正確的。當傳遞'char *'時,指針是按值傳遞的,無法更改,但指向的值可以。然而,這是非常不安全的。 – 2010-03-31 23:08:08

+0

對,這就是爲什麼我發佈的代碼有char **的參數** – cpalmer 2010-03-31 23:09:44

+1

問題是,如果調用方爲函數分配內存以將值存儲在 – 2010-03-31 23:11:18

0
  • 寧要使用指針引用。
  • 將ssn傳遞爲常量引用,因此generate_codes不能修改ssn。
  • 使用std :: string,除非它太慢。

如何:

#include <string> 
#include <iostream> 

int generate_codes(const std::string& ssn, std::string& student_id) 
{ 
student_id = "STU-" + ssn; 
return 0; 
} 

int main() 
{ 
std::string ssn = "987098765"; 
std::string student_id; 
int value = generate_codes(ssn, student_id); 
std::cout << "student id= " << student_id << " Pass/fail= " << value << std::endl; 
return 0; 
} 

輸出:

學生ID = STU-987098765合格/不合格= 0