Чтение аргументов командной строки в программе на C - PullRequest
0 голосов
/ 16 апреля 2011

Это преобразует аргумент ./a.out -b 101 в десятичную 5, хотя я пытаюсь преобразовать 101 в двоичное число, только если я дам ему аргумент -b

#include <stdio.h>
void main(int argc, char *argv[])
{
  if ((argc == 3) && (argv[2] == "-b") ) //here lies the problem
  {
    int n = 0;
    char *c_pt = argv[2];

    printf("argv[1]: %s\n", argv[1]);
    while (*c_pt)
    {
      if (*c_pt < '0' || *c_pt > '1')
      {
        break;
      }
      n = n * 2 + *c_pt - '0';
      c_pt++;
    }
    printf("%d\n", n);

  }
}

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

В C вам нужно вызвать strcmp(3) для сравнения строк.

2 голосов
/ 16 апреля 2011

Аргументы индексов отсчитываются от 0 с названием программы. argv[1] содержит строку "-b", а argv[2] содержит строку "101".

Кроме того, вам нужно #include <string.h> и использовать strcmp() для сравнения строк.

Внутренне число будет двоичным независимо от того, как вы его конвертируете. Тем не менее, нет простого способа печати двоичного числа в C. Вы можете использовать strtol() (из <stdlib.h>) или одного из его родственников, чтобы преобразовать строку в двоичное значение. Вероятно, вам следует использовать это для преобразования строки в значение (хотя, в общем, вам нужно быть достаточно осторожным, обнаруживая условия ошибки из strtol(); она неуловима с возвратами).

7.20.1.4 Функции strtol, strtoll, strtoul и strtoull

long strtol(const char * restrict nptr, char ** restrict endptr, int base);

¶7 Если предметная последовательность пуста или не имеет ожидаемой формы, преобразование не выполняется. выполнила; значение nptr хранится в объекте, на который указывает endptr, при условии этот endptr не является нулевым указателем.

Возвращает

¶8 Функции strtol, strtoll, strtoul и strtoull возвращают преобразованные значение, если есть. Если преобразование не может быть выполнено, возвращается ноль. Если правильное значение находится вне диапазона представимых значений, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, ULONG_MAX или ULLONG_MAX возвращается (в соответствии с типом возврата и знак значения, если оно есть), а значение макроса ERANGE хранится в errno.

Вы хотели бы убедиться, что все непустые символы были преобразованы, среди прочего.

1 голос
/ 16 апреля 2011
#include <stdio.h>

void main(int argc, char *argv[])
{
    if ((argc == 3) && (0 == strcmp(argv[1], "-b")) ) //here lies the problem
    {
        int n = 0;
        char *c_pt = argv[2];

        printf("argv[2]: %s\n", argv[2]);
        while (*c_pt)
        {
            if (*c_pt < '0' || *c_pt > '1')
            {
                break;
            }
            n = n * 2 + *c_pt - '0';
            c_pt++;
        }
        printf("%d\n", n);

    }
}

Несмотря на то, что моя версия предпочла бы использовать

char* end;
printf("%li\n", strtol(argv[2], &end, 2));
...