【问题标题】:C++ How to write function that return char pointerC ++如何编写返回char指针的函数
【发布时间】:2017-08-29 11:35:59
【问题描述】:

我想写一个函数,接收一个 int 参数,然后转换成一个 char 指针(c-string),但是我的代码输出不对。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
char *stoc(int n){
    stringstream stream;
    stream <<"Log"<<n<<".txt";
    string name;
    stream >>name;
    int len = name.length();

    char ch[len+1];
    for(int i=0; i<len; i++){
        ch[i]=name[i];

    }
    ch[len+1] = '\0';

    return ch;
}

int main() {
    char *name = stoc(3);
    cout << name << endl;

    return 0;
}

【问题讨论】:

  • 在 C++ 中,您不这样做。请使用std::string,不要使用VLA。
  • 两个问题:首先C++没有variable-length arrays。其次,更糟糕的是,您返回一个指向数组的指针,该数组将超出范围并在函数返回后消失。
  • 哦,你也超出了ch 数组的范围,ch[len+1] = '\0'; 罢工三。
  • 为什么要将std::string 转换为C 风格的字符串?只需返回 name 而不是 ch。如果您确实需要转换它们,您以后仍然可以使用std::string::c_str()
  • 最后,如果你改变函数返回一个std::string,它可以被转换成一个单行:return "Log" + std::to_string(n) + ".txt"; 然后如果你出于某种原因需要一个const char* 到字符串,使用c_str() 获取它。

标签: c++ arrays char


【解决方案1】:

对cmets的总结:

你通常不会在 C++ 中使用 C 风格的字符串,只要坚持std::strings。因此,您应该返回name 而不是转换后的ch,特别是因为您已经创建了std::string。至少可以访问 C++11,然后您可以轻松地将您相当长的函数转换为单行函数

C++11

std::string stoc(int n) {
  return "Log" + std::to_string(n) + ".txt";
}

C++11 之前的版本

std::string stoc(int n) {
  std::ostringstream oss;
  oss << "Log" + n + ".txt";
  return oss.str(); // by accessing a stringstreams content directly there is no need to use an extra variable
}

如果您稍后确实需要在某个地方使用 C 样式字符串,例如作为 C 库函数的参数,您可以使用 c_str 将任何 std::string 转换为它的 C 风格等效项:

int main() {
    std::string name = stoc(3);
    std::cout << name << std::endl;
}

【讨论】:

    【解决方案2】:

    您应该这样做而不是返回指向局部变量的指针(这会导致未定义的行为):

    ...
    char *ch = new char[len+1];
    for(int i=0; i<len; i++){
        ch[i]=name[i];
    }
    ch[len] = '\0';
    ...
    
    int main() {
        char *name = stoc(3);
        cout << name << endl;
        delete [] name;   // delete what has been allocated in stoc
    
        return 0;
    }
    

    还要注意ch[len] = '\0' 而不是ch[len + 1] = '\0'

    但在 C++ 中,您应该使用 std::string 而根本不处理 char 数组、newdelete

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2021-07-28
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多