2010-12-02 2 views
0

Я пытаюсь написать простую государственную машину исполнителем в С. У меня есть этот код:Почему бы не увеличивать z?

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 остается равным 0, даже если x успешно увеличивает каждую третью строку.

мне нужен выходной сигнал следующим образом:

1 0 \ п 1 1 \ п 1 2 \ п 2 0 \ п 2 1 \ п 2 2 \ п 3 0 \ п 3 1, и т.д .. .

Вместо этого я получаю:

1 0 \ п 1 0 \ п 1 0 \ п 2 0 \ п 2 0 \ п 2 0 \ п 3 0 \ п 3 0 и т.д. ..

Что мне нужно изменить? Это может быть глупый вопрос, но я действительно не понимаю, что здесь не так.

Благодарим вас за помощь.

ответ

9

г всегда установлен на нуль. Оператор 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; 
} 
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; 
    } 
} 
+1

+1 Стоит отметить, что, когда не с помощью фигурных скобок, только первое утверждение условно выполняется, т.е.до точки с запятой, а не разрыва строки. – Skilldrick 2010-12-02 23:37:34

+0

или, в этом случае, вы можете поместить `,` вместо `;`;; – ruslik 2010-12-02 23:38:27

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; 
} 
1

Ваша проблема в этой строке:

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

Без скобок, если будет включать в себя только заявление x++ и ваш компилятор будет интерпретировать ваш код, такой как:

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

Принимается во внимание, что z = 0 выполняется каждый раз. Чтобы исправить это, используйте фигурные скобки (для 2-х или более операторов в блоке, если)

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