2010-03-31 80 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