在C中摆脱循环

在C中摆脱循环,c,for-loop,while-loop,C,For Loop,While Loop,我试图使用C退出while循环,但使用中断、返回或更改while条件不起作用 基本上,我想知道为什么在最后一个else if中,当我声明back=true时,我的代码一直输入for 我希望得到如下输出:enter1,enter1,enter1,enter1,enter2 相反,输出类似于enter1、enter1、enter1、enter2、enter2、enter1、enter1、enter1 这是我的代码工作: void SolveMap8(Core* core_building, Buil

我试图使用C退出
while循环,但使用中断、返回或更改while条件不起作用

基本上,我想知道为什么在最后一个
else if
中,当我声明
back=true
时,我的代码一直输入
for

我希望得到如下输出:
enter1,enter1,enter1,enter1,enter2

相反,输出类似于
enter1、enter1、enter1、enter2、enter2、enter1、enter1、enter1

这是我的代码工作:

void SolveMap8(Core* core_building, Building* new, Stack* solve, bool goingBack){
  Core* coreBuilding = core_building;
  Building* first = new -> linked[0];
  Building* next  = NULL;
  bool back = goingBack;
  while (back == false) {
    for (int i = 0; i < (first -> zone -> building_count); i++) {
      if (first ->  zone -> buildings[i] != NULL) {
        if (first != first ->  zone -> buildings[i]) {
          next  = first ->  zone -> buildings[i];
          if(next -> color == coreBuilding -> buildings[0] -> color && !city_client_is_taken(next)) {
            puts("enter0");
            Building_Pair* newPair = Building_Tuple_Create(first, next);
            stack_push(solve, newPair);
            city_client_link(first, next);
            break;
          }
          else if(!city_client_is_taken(next)) {
            if (city_client_is_blank(next)) {
              if (!(next -> cored)) {
                puts("enter1");
                Building_Pair* newPair = Building_Tuple_Create(first, next);
                stack_push(solve, newPair);
                city_client_link(first, next);
                SolveMap8(coreBuilding, next, solve, false);
              }
            }
          }
          else if (city_client_is_taken(next)) {
            if (i == first -> zone -> building_count - 1) {
                puts("enter2");
                back = true;
            }
          }
        }
      }
    }
  }
}
void SolveMap8(核心*Core_建筑,建筑*新建,堆栈*求解,布尔返回){
核心*核心建筑=核心建筑;
建筑*first=新建->链接[0];
Building*next=NULL;
后退=后退;
while(back==false){
对于(int i=0;i<(第一->区域->建筑计数);i++){
如果(第一->区域->建筑[i]!=NULL){
如果(第一个!=第一个->区域->建筑[i]){
下一步=第一步->分区->建筑[i];
如果(下一步->颜色==coreBuilding->buildings[0]->color&&!city\u客户(下一步)){
看跌期权(“输入0”);
Building\u Pair*newPair=Building\u Tuple\u Create(第一个,下一个);
堆栈推送(求解,新对);
城市客户链接(第一个,下一个);
打破
}
如果(!城市客户(下一个)){
如果(城市\客户\为\空白(下一个)){
如果(!(下一步->取芯)){
认沽权(“1”);
Building\u Pair*newPair=Building\u Tuple\u Create(第一个,下一个);
堆栈推送(求解,新对);
城市客户链接(第一个,下一个);
SolveMap8(coreBuilding,next,solve,false);
}
}
}
否则,如果(城市客户被接管(下一个)){
如果(i==first->zone->building\u count-1){
认沽权(“第2项”);
返回=真;
}
}
}
}
}
}
}

更新抱歉,错过了递归。在这种情况下,您的问题与缺少break语句无关,而是您正试图在与当前不同的范围内从for循环中逃逸。您需要特殊的逻辑来处理全局“完成”条件。也许是这样的:

void process(Core* core, bool& done) {
    for (int i = 0; i < core->size() && !done; ++i) {
        if (!core[i]->is_taken()) {
            process(core[i], done);
        } else if (core[i]->is_taken() {
            // done procesing
            done = true;
        }
    }
}

// use via
bool done = false;
process(myCore, done);
void流程(核心*Core,bool&done){
对于(int i=0;isize()&&!done;++i){
如果(!core[i]->被取(){
过程(核心[i],完成);
}如果(核心[i]->被取(){
//完成加工
完成=正确;
}
}
}
//使用via
bool done=false;
过程(myCore,done);

在您拥有的版本中,goingBack标志是按值传递的,因此每个函数都有自己的副本,并且没有办法将back的值传递给递归调用链中的父级。在我上面的代码中,done作为引用传递,因此在递归链中的某个点更改该值将使其在父级范围中可见(因为变量的范围在函数本身之外)。希望这更有帮助。

更新很抱歉,错过了递归。在这种情况下,您的问题与缺少break语句无关,而是您试图在与当前不同的范围内从for循环中逃逸。您需要特殊的逻辑来处理全局“done”条件。可能是这样的:

void process(Core* core, bool& done) {
    for (int i = 0; i < core->size() && !done; ++i) {
        if (!core[i]->is_taken()) {
            process(core[i], done);
        } else if (core[i]->is_taken() {
            // done procesing
            done = true;
        }
    }
}

// use via
bool done = false;
process(myCore, done);
void流程(核心*Core,bool&done){
对于(int i=0;isize()&&!done;++i){
如果(!core[i]->被取(){
过程(核心[i],完成);
}如果(核心[i]->被取(){
//完成加工
完成=正确;
}
}
}
//使用via
bool done=false;
过程(myCore,done);

在您拥有的版本中,goingBack标志是按值传递的,因此每个函数都有自己的副本,并且没有办法将back的值传递给递归调用链中的父级。在我上面的代码中,done作为引用传递,因此在递归链中的某个点更改该值将使其在父级范围中可见(因为变量的范围超出了函数本身)。希望这更有帮助。

测试
back==false
将在
for
循环终止之前完成。可能在
if(city\u client\u is take(next))
分支中,您想说
back=true
,然后
中断;
?if(i==第一->区域->建筑计数-1)
设置前的条件
back=true
意味着这只会发生在
for
循环的最后一次迭代中,因此不需要
中断
。尝试在
for
循环的每次迭代中打印
i
的值,并在循环之前打印
first->zone->building\u count
的值循环。这会让您更好地了解正在发生的事情。是否有可能多次调用
SolveMap8
?请注意,箭头
->
和点
运算符绑定得非常紧密,不应该用空格将它们与操作数分开。也就是说,如果(next->color==coreBuilding->buildings[0]->color&&!city\u client\u已被采用(next))如果(next->color==coreBuilding->buildings[0]->color&!city\u client\u已被采用(next))(注意关键字后面的空格)测试
back==false
将在你的
for
循环终止之前进行。可能在你的
if(city\u client\u is_take(next))
分支中,你想说
back=true
然后
中断;
如果(i==first->zone->building\u count-1)设置前的条件
back=true
意味着这只会发生在
for
循环的最后一次迭代中,因此不需要
中断
。尝试在
for
循环的每次迭代中打印
i
的值,