为什么不递增z?

时间:2010-12-02 23:31:00

标签: c matrix while-loop

我正在尝试用C编写一个简单的状态机执行器。我有这个代码:

while(1) {  
  strcpy(fsm.state[x][z], lines[i]);
  printf("%i %i\n", x, z);
  z++; i++;
  if(strcmp(lines[i], ".") == 0) x++; z = 0;
  if(strcmp(lines[i], "") == 0) break;
}

我不明白为什么如果 z 只能在我从数组中读取的当前行等于“。”时重置,每次都会发生在我的测试场景中第三次出现, z 保持等于0,即使 x 每隔三行成功递增一次。

我需要这样的输出:

  

1 0 \ n 1 1 \ n 1 2 \ n 2 0 \ n 2 1 \ n 2 2 \ n 3 0 \ n 3 1等...

相反,我得到:

  

1 0 \ n 1 0 \ n 1 0 \ n 2 0 \ n 2 0 \ n 2 0 \ n 3 0 \ n 3 0等等......

我需要改变什么?这可能是一个愚蠢的问题,但我真的不明白这里有什么问题。

谢谢你的帮助。

4 个答案:

答案 0 :(得分:9)

z始终设置为零。 if语句根据该行不起作用,它将转到下一个分号。

if(strcmp(lines[i], ".") == 0) x++; z = 0;
if(strcmp(lines[i], "") == 0) break;

与:

相同
if(strcmp(lines[i], ".") == 0){
 x++;
}

z = 0;

if(strcmp(lines[i], "") == 0){
 break;
}

由于你有两个语句(x++; z = 0;),你需要在它们周围加上大括号来指定条件:

if(strcmp(lines[i], ".") == 0){
 x++;
 z = 0;
}

答案 1 :(得分:7)

使用大括号,避免混淆:)

while(1) {  
  strcpy(fsm.state[x][z], lines[i]);
  printf("%i %i\n", x, z);
  z++; i++;
  if(strcmp(lines[i], ".") == 0) {
        x++; 
        z = 0;
  }
  if(strcmp(lines[i], "") == 0) {
        break;
  }
}

答案 2 :(得分:2)

if(strcmp(lines[i], ".") == 0) x++; z = 0;

与:

相同
if(strcmp(lines[i], ".") == 0) 
   x++; 
z = 0;

你可能想要

if(strcmp(lines[i], ".") == 0) {
     x++; 
     z = 0;
}

答案 3 :(得分:1)

你的问题在这一行:

if(strcmp(lines[i], ".") == 0) x++; z = 0;

如果没有大括号,if只包含语句x++,您的编译器会解释您的代码,如:

if(strcmp(lines[i], ".") == 0)
    x++;
z = 0;

每次都会执行z = 0。要解决此问题,请使用大括号(if块中的2个或更多语句)

if(strcmp(lines[i], ".") == 0) {
    x++;
    z = 0;
}