用于存储值的函数参数

时间:2010-03-31 22:37:02

标签: c++

我必须定义一个接口。我的作业中的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?
  4. 我的应用代码看起来像

    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。

3 个答案:

答案 0 :(得分:1)

那个错误似乎很奇怪。你确定它是正确的,因为它看起来不错。至于你的功能。至于你的问题:

  1. 从C ++的角度来看,您应该使用const std::string &作为输入参数,使用std::string &作为输出参数。这看起来像这样:

    bool generate_codes(const std :: string&amp; ssn,std :: string&amp; student_id)

    如果您想表达通过或失败,则返回值应为bool

  2. 请参阅我对1的回答。

  3. 假设std::string真的以NULL结尾,那么从const char *构建const char *看起来没问题。
  4. 编辑再次阅读您的问题后,我建议您考虑更改指针更改指向的值之间的区别

答案 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;
}