我正在尝试用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等等......
我需要改变什么?这可能是一个愚蠢的问题,但我真的不明白这里有什么问题。
谢谢你的帮助。
答案 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;
}