C 如何编写返回字符指针的功能

C++ How to write function that return char pointer

本文关键字:指针 功能 字符 返回 何编写      更新时间:2023-10-16

我想编写一个接收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] = '';
    return ch;
}
int main() {
    char *name = stoc(3);
    cout << name << endl;
    return 0;
}

总结注释:

通常,您不使用C 中的C风格串,只需坚持std::string s即可。因此,您宁愿返回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;
}

您应该执行此操作,而不是将指针返回到本地变量(以未定义的行为产生):

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

还请注意ch[len] = ''而不是ch[len + 1] = ''

但是,在C 中,您应该使用std::string,而不是完全处理char数组,newdelete