Несколько сравнений ИЛИ для одной позиции массива - PullRequest
0 голосов
/ 17 марта 2011

Извините, я не смог произнести эту тему особенно хорошо. Проще говоря, у меня есть оператор IF, в котором я сравниваю, если выполнены три условия;

if(buffer[i] == "N" && (buffer[i+1] == "1"||"2"||"3"||"4"||"5") && buffer[i+2] == " ")

Я знаю, что N всегда будет присутствовать, после этого символ должен быть числом от 1 до 5, после которого это пробел. Это компилирует, но не дает никакого результата, и я бы сказал, что это мой ужасный код выше.

Я должен добавить, что это внутри цикла while, который продвигается через буфер до тех пор, пока пробелы не заканчиваются.

Я слишком усложнил простую проблему или я на правильном пути, но с дерьмовым синтаксисом?

Спасибо за любые предложения или советы.

Ответы [ 5 ]

2 голосов
/ 17 марта 2011

Вы не можете спросить

буфер [i + 1] == "1" || "2"

Вы должны спросить

буфер [i + 1] == "1" || буфер [i + 1] == "2"

Но если это строки C, то вы вообще не можете использовать == - вам нужно использовать функцию strcmp () из стандартной библиотеки, которая возвращает 0, когда две строки равны:

strcmp (буфер [i + 1], "1") == 0 || strcmp (буфер [i + 1], "2") == 0

1 голос
/ 17 марта 2011

Или не работает так же, как и сравнение строк в C. Прежде всего, вы, вероятно, хотели сравнить с char s.

Во-вторых, a == b||c||d||e эквивалентно a == (b||c||d||e), что, вероятно, в конечном итоге будет 1.

То, что вы хотели сказать, было (наивно) (buffer[i+1] == '1') || (buffer[i+1] == '2') || (buffer[i+1] == '3') ...

Проще сказать, поскольку вы используете символы ASCII:

(buffer[i+1] >= '1') && (buffer[i+1] <= '5')

Не забудьте заменить "N" и " " на 'N' и ' ' соответственно.

1 голос
/ 17 марта 2011

Ниже два выражения эквивалентны.Вы || делаете неправильные вещи.

  • (buffer[i+1] == "1"||"2"||"3"||"4"||"5")
  • (((((buffer[i+1] == "1")||"2")||"3")||"4")||"5")

То, что вы пытаетесь достичь, это.

  • (buffer[i+1] >= '1' && buffer[i+1] <= '5')

Кроме того, я считаю, что ваш код не будет компилироваться, поскольку одностроковые элементы имеют тип char.Их литералы обозначены '1', '2', 'N' и т. Д.

1 голос
/ 17 марта 2011

1-е сравнение должно быть buffer[i] == 'N', а не buffer[i] == "N", потому что вы хотите сравнивать символы, а "N" - указатель на символ, а не символ.

2-е сравнение должно быть buffer[i+1] >= '1' && buffer[i+1] <='5' по той же причине.

0 голосов
/ 17 марта 2011

Думаю, я бы использовал sscanf:

char digit[2];

if (1==sscanf(buffer+i, "N%[12345][ ]", &digit))
    // It matched. `digit` holds the digit we found in string form.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...