我是C ++的新手学习语言和玩耍。我写了一段我不理解的行为代码。有人可以解释为什么下面的代码打印出随机垃圾而不是列表中第一个字符串的第一个字符(即a
)。
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <climits>
#include <stdio.h>
char* str2char(std::string str)
{
char cset[str.size()+1]; // +1 for the null character
for(int i = 0; i < str.size(); i++)
{
cset[i] = str[i];
}
cset[str.size()] = '\0';
return cset;
}
int main (int argc, char * const argv[]) {
std::vector< std::string > ladontakadet;
ladontakadet.push_back("aabcbbca");
ladontakadet.push_back("abcdabcd");
ladontakadet.push_back("cbbdcdaa");
ladontakadet.push_back("aadcbdca");
ladontakadet.push_back("cccbaaab");
ladontakadet.push_back("dabccbaa");
ladontakadet.push_back("ccbdcbad");
ladontakadet.push_back("bdcbccad");
ladontakadet.push_back("ddcadccb");
ladontakadet.push_back("baccddaa");
std::string v = ladontakadet.at(0);
char *r;
r = str2char(v);
std::cout << r[0] << std::endl;
return 0;
}
当我期望它输出a
时,为什么我的返回垃圾?
Thnx任何帮助!
P.S。此代码的输出是随机的。它并不总是打印相同的字符..:S
答案 0 :(得分:12)
这是因为你返回一个指向局部变量的指针,一个局部变量在函数返回时超出范围。
您已经使用std::string
作为参数,使用它而不是数组和返回指针。
答案 1 :(得分:2)
你的函数正在返回垃圾,因为你在函数返回后返回超出范围的局部变量的地址。它应该看起来像这样:
char* str2char(const std::string &str)
{
char *const cset = new char[str.size() + 1]; // +1 for the null character
strcpy(cset, str.c_str());
return cset;
}
您需要执行r
删除变量delete[] r;
。理想情况下,您不会使用原始指针,并且您将std::string
用于所有内容,或将char *
包装在std::unique_ptr
中。
答案 2 :(得分:2)
如果您的目标是将std :: string的内容传递给修改char *内容的函数:
#include <iostream>
#include <vector>
void f(char* s) {
s[0] = 'H';
}
std::vector<char> to_vector(const std::string& s) {
return std::vector<char>(s.c_str(), s.c_str() + s.size() + 1);
}
int main(void)
{
std::string s = "_ello";
std::vector<char> t = to_vector(s);
f(t.data());
std::cout << t.data() << std::endl;
}