我想写一个函数接收一个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;
}
答案 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
数组,new
和delete
。