我必须定义一个接口。我的作业中的API如下所述:
int generate_codes(char * ssn, char * student_id);
int表示0或1表示通过或失败。 studentid是一个输出参数,应该返回一个6位数的id。 ssn是一个9位数的输入参数
他们的学校课程将使用ssn并使用我的代码生成学生ID。
我的应用代码看起来像
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;
我基本上得到了关于&lt;&lt;&lt;&lt;不兼容操作数的右侧。当我将代码更改为
时std::cout<<"student id= "<<test.c_str()<<" Pass/fail= "<<value<<std::endl;
然后它工作但我得到垃圾的价值。不知道如何从指针获取值。函数内部的值打印就好了。但是当我尝试在功能之外打印它时会打印出垃圾。在上面的函数中,我设置了studndt_id,就像这样
std::string str_studnt_id = studnt_id;
这是将一个字符串参数带到我执行代码生成的真正功能上。 当我准备好代码并想要返回它时,我会执行以下操作:
studnt_id = str_studnt_id.c_str();
是否应该使str_studnt的地址指向studnt_id的地址,因此我对其指向它的值所做的任何更改应该反映在函数外部?这个API使用char *但我的函数使用std :: string。
答案 0 :(得分:1)
那个错误似乎很奇怪。你确定它是正确的,因为它看起来不错。至于你的功能。至于你的问题:
从C ++的角度来看,您应该使用const std::string &
作为输入参数,使用std::string &
作为输出参数。这看起来像这样:
bool generate_codes(const std :: string&amp; ssn,std :: string&amp; student_id)
如果您想表达通过或失败,则返回值应为bool
。
请参阅我对1的回答。
std::string
真的以NULL结尾,那么从const char *
构建const char *
看起来没问题。编辑再次阅读您的问题后,我建议您考虑更改指针和更改指向的值之间的区别
答案 1 :(得分:0)
在函数内部,字符串变量在堆栈上分配。当你从函数返回时,变量被销毁,因此垃圾值在
之外你可以做的事情就像这样
void my_func(std::string* pmy_string)
{
std::string &my_string = *pmy_string;
// use my_string
}
string my_string;
my_func(&my_string);
答案 2 :(得分:-1)
char * student_id不能用作输出参数,因为指针是按值传递的,而不是通过引用传递的。将它作为char **传递将起作用。类似下面的内容(虽然它确实应该使用std :: string而不是char *):
int generate_codes(char * ssn, char ** student_id)
{
*student_id = new char[2];
(*student_id)[0] = 'Z';
(*student_id)[1] = '\0';
return 0;
}