C++ 返回后更改字符

C++ 返回后更改字符,c++,return,C++,Return,这是一个试图解决代码战问题的解决方案: 我的BFS函数没有返回正确的字符,尽管我在返回之前打印并在控制台中看到正确的字符。这似乎是由于某种原因导致的基因突变。当我将函数签名更改为std::string返回值时,程序崩溃。我不知道我做错了什么。这可能是由于缺少自由指针或其他原因吗 typedef struct proTree{ char value; proTree* left; proTree* right; } proTree; char BFS(std::vecto

这是一个试图解决代码战问题的解决方案:

我的BFS函数没有返回正确的字符,尽管我在返回之前打印并在控制台中看到正确的字符。这似乎是由于某种原因导致的基因突变。当我将函数签名更改为std::string返回值时,程序崩溃。我不知道我做错了什么。这可能是由于缺少自由指针或其他原因吗

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++。您正在泄漏内存。