C ++如何编写返回char指针的函数

时间:2017-08-29 11:36:00

标签: c++ arrays char

我想写一个函数接收一个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;
}

2 个答案:

答案 0 :(得分:1)

总结评论:

您通常不会在C ++中使用C样式字符串,只需坚持std::string即可。因此,您应该返回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;
}

答案 1 :(得分:0)

你应该这样做,而不是返回一个指向局部变量的指针(产生未定义的行为):

...
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