C++ 返回后更改字符
这是一个试图解决代码战问题的解决方案: 我的BFS函数没有返回正确的字符,尽管我在返回之前打印并在控制台中看到正确的字符。这似乎是由于某种原因导致的基因突变。当我将函数签名更改为std::string返回值时,程序崩溃。我不知道我做错了什么。这可能是由于缺少自由指针或其他原因吗C++ 返回后更改字符,c++,return,C++,Return,这是一个试图解决代码战问题的解决方案: 我的BFS函数没有返回正确的字符,尽管我在返回之前打印并在控制台中看到正确的字符。这似乎是由于某种原因导致的基因突变。当我将函数签名更改为std::string返回值时,程序崩溃。我不知道我做错了什么。这可能是由于缺少自由指针或其他原因吗 typedef struct proTree{ char value; proTree* left; proTree* right; } proTree; char BFS(std::vecto
typedef struct proTree{
char value;
proTree* left;
proTree* right;
} proTree;
char BFS(std::vector<proTree*> vec, int currLevel, int level, int pos){
if (currLevel == level){
if (vec[pos-1]->value == 'E'){
return 'E';
} else {
return 'D';
}
}
std::vector<proTree*> newVec;
for (int i=0; i<vec.size(); i++){
newVec.push_back(vec[i]->left);
newVec.push_back(vec[i]->right);
}
BFS(newVec, currLevel+1, level, pos);
}
void createTree(proTree* root, int currLevel, int level){
if (currLevel == level) return;
proTree* eTree = new proTree();
eTree->value = 'E';
proTree* dTree = new proTree();
dTree->value = 'D';
if (root->value=='E'){
root->left = eTree;
root->right = dTree;
} else {
root->left = dTree;
root->right = eTree;
}
createTree(eTree, currLevel+1, level);
createTree(dTree, currLevel+1, level);
}
std::string findProfession(int level, int pos) {
proTree* eTree = new proTree();
eTree->value = 'E';
createTree(eTree, 0, level);
std::vector<proTree*> vec = {eTree};
char result = BFS(vec, 0, level, pos);
if (result == 'E'){
return "Engineer";
} else {
return "Doctor";
}
}
typedef结构proTree{
字符值;
proTree*左;
proTree*对;
}proTree;
字符BFS(标准::向量向量向量,int currLevel,int level,int pos){
如果(currLevel==级别){
如果(向量[pos-1]->值=='E'){
返回“E”;
}否则{
返回“D”;
}
}
std::vector newVec;
对于(int i=0;ileft);
newVec.push_back(vec[i]>right);
}
BFS(新VEC,当前级别+1,级别,位置);
}
void createTree(proTree*root,int currLevel,int level){
如果(currLevel==level)返回;
proTree*eTree=新的proTree();
eTree->value='E';
proTree*dTree=新的proTree();
dTree->value='D';
如果(根->值=='E'){
根->左=eTree;
根->右=数据树;
}否则{
根->左=数据树;
根->右=eTree;
}
createTree(eTree,currLevel+1,level);
createTree(dTree,currLevel+1,level);
}
std::字符串findProfession(int级别,int位置){
proTree*eTree=新的proTree();
eTree->value='E';
createTree(eTree,0,级别);
std::vector vec={eTree};
字符结果=BFS(向量,0,级别,位置);
如果(结果='E'){
返回“工程师”;
}否则{
返回“医生”;
}
}
BFS
不返回任何内容(实际返回值未定义),因为缺少最后一行函数return
,并且递归函数调用的值丢失。应该是:
return BFS(newVec, currLevel+1, level, pos);
您应该注意编译警告。在这种情况下,编译器应该明确抱怨“函数返回非void时缺少返回”或类似的问题。
BFS
不返回任何内容(实际返回值未定义),因为最后一个函数行缺少return
,递归函数调用的值丢失。应该是:
return BFS(newVec, currLevel+1, level, pos);
您应该注意编译警告。在这种情况下,编译器应该明确地抱怨“函数返回非void时缺少返回”或类似的问题。大多数现代编译器在默认情况下配置为不警告此类情况,但可以进行配置(例如,命令行选项)这样做。@Peter大多数程序员默认配置为使用
-Wall-Wextra
编译,如果不是这样,就应该这样配置。@bolov-这样的“程序员配置”绝不是自动的。像这样的新手问题经常出现,因为有些人不知道配置编译器的价值,所以没有收到警告。和gcc或clang不是唯一的编译器-其他编译器提供不同的方式来启用警告。大多数现代编译器在默认情况下配置为不对此类事件发出警告,但可以进行配置(例如,命令行选项)这样做。@Peter大多数程序员默认配置为使用-Wall-Wextra
编译,如果不是这样,就应该这样配置。@bolov-这样的“程序员配置”绝不是自动的。像这样的新手问题经常出现,因为有些人不知道配置编译器的价值,所以没有收到警告。GCC或CLAN不是唯一的编译器-其他编译器提供不同的方式来启用警告。<代码> TyBuffsStult是C,您不需要/使用C++。您正在内存泄漏。<代码> TyBuffFrase是C,您不需要/需要C++。您正在泄漏内存。