Проверка того, не является ли какой-либо символ в аргументе командной строки "1" или "0" в C

Часть программы, которую я пишу, ожидает двоичное число в аргументе командной строки и возвращает его значение в виде десятичного числа. Часть программы проверяет, является ли аргумент командной строки фактическим двоичным числом (то есть оно не содержит цифр 2-9). Это казалось относительно простым для реализации, но по какой-то причине это не работает:

int i;
for (i = 0; i < strlen(argv[3] - 1); i++)
{
  if (argv[3][i] != '0' || argv[3][i] != '1' || argv[3][i] != '\0')
  {
    printf("arg[3][%d]: %c\n", i, argv[3][i]);
    printf("ERROR: argument 3 is not a binary integer\n%);
    return 0;
  }
}

(argv [3] - это аргумент, в котором предполагается использовать двоичное значение).

Даже если я просто укажу аргумент "0001", он вернется:

"arg [3] [0]: 0

ОШИБКА: аргумент 3 не является двоичным целым числом "

Остальная часть кода работает нормально, поэтому я знаю, что это просто что-то очевидное, что я не вижу в логике в операторе if. Любая помощь?

1 ответ

Решение

Линия:

if (argv[3][i] != '0' || argv[3][i] != '1' || argv[3][i] != '\0')

всегда будет решаться на истину. Вы должны использовать && для AND, а не || для ИЛИ.

Кроме того, у вас была ошибка с strlen(argv[3]-1);, Я предполагаю, что вы на самом деле имели в виду strlen(argv[3])-1;, так как первый будет указывать на плохое место в памяти. Однако второй вам тоже не нужен, так как он пропустит последний символ.

Ниже приведен код, модифицированный для работы:

#include <stdio.h>
#include <string.h>

int main( int argc, char** argv )
{
    int i;
    for (i = 0; i < strlen(argv[3]); i++)
    {
        if (argv[3][i] != '0' && argv[3][i] != '1' && argv[3][i] != '\0')
        {
            printf("arg[3][%d]: %c\n", i, argv[3][i]);
            printf("ERROR: argument 3 is not a binary integer\n");
            return 0;
        }
    }

    return 0;
}
Другие вопросы по тегам