【问题标题】:function parameter used to store value用于存储值的函数参数
【发布时间】:2010-04-01 10:17:30
【问题描述】:

我必须定义一个接口。我作业中的API如下:

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

int 表示通过或失败的 0 或 1。 studentid 是一个输出参数,应该返回一个 6 位数的 id。 ssn 是一个 9 位的输入参数

他们的学校计划将采用 ssn 并使用我的代码生成学生 ID。

  1. 现在从 API 的角度来看,我不应该对两个参数都使用 const char *。
  2. 不应该通过引用传递studentid吗?而不是指针?
  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; 

然后它起作用了,但我得到了价值的垃圾。不知道如何从指针中获取值。函数内的值打印得很好。但是当我尝试在函数之外打印它时,它会打印垃圾。在上面的函数中,我确实设置了 studndt_id

std::string str_studnt_id = studnt_id;

这是将字符串参数带入执行代码生成的真正功能。 当我准备好代码并想要返回它时,我会执行以下操作:

studnt_id = str_studnt_id.c_str();

是否应该使 str_studnt 的地址指向 studnt_id 的地址,因此我对其指向它的值所做的任何更改都应该反映在函数之外?此 API 使用 char *,但我的函数使用 std::string。

【问题讨论】:

  • API 指定 char* 的事实并不意味着您不能更改该接口。只是提议改变它。这避免了您必须包装它并为非常简单的事情创建不必要的复杂性。

标签: c++


【解决方案1】:

这个错误看起来很奇怪。您确定它在正确的行中吗,因为它对我来说看起来不错。至于你的功能。至于你的问题:

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

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

    返回值应该是bool如果你想表达通过或失败。

  2. 查看我对 1 的回答。

  3. 假设 const char * 确实以 NULL 结尾,您从 const char * 构造 std::string 看起来不错。

编辑再次阅读您的问题后,我建议您考虑更改指针更改其指向的值之间的区别 .

【讨论】:

    【解决方案2】:

    在函数内部,字符串变量在堆栈上分配。当你从函数返回时,变量被销毁,因此外面的垃圾值

    你可以做的事情就是这样

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

    【讨论】:

    • 为什么不首先将字符串作为引用传递?
    • 对于一个不是 api 要求的。这意味着我认为我可以做到,但我仍然需要使用 char * 而不是 std::string。我只是不确定如何传递指针的地址与被破坏的指针地址的副本,我失去了一切。那么如何使用 char * 执行上述操作,然后将其转换为字符串,以便将其发送到我的内部函数?
    【解决方案3】:

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

    【讨论】:

    • -1 这是不正确的。传递char * 时,指针按值传递,不能更改,但它指向的值可以。然而,这是非常不安全的。
    • 对,这就是为什么我发布的代码有一个char**的参数
    • 重点是,如果调用者为函数分配内存来存储值,char * 将用作输出参数。
    • 好吧,在这种情况下,我将把这段代码发送到另一个 Windows 系统但是,我只是想确保它可以正常工作,我唯一的保证是 char * 将始终与 std ::string 可能有效也可能无效。我怀疑这就是他告诉我们使用 char * 的原因。但这并不能阻止我在内部使用 std::string 。所以我想如果我使用指针,我将如何将指针的地址分配给我在函数中拥有的临时字符串,以修改放置在该地址中的值。因此,std::string = char * 我将要输出的地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2017-06-09
    • 2016-12-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多