Не можете сравнить argv? - PullRequest
5 голосов
/ 21 ноября 2010

У меня есть этот код:

if (argv[i] == "-n") 
{
    wait = atoi(argv[i + 1]);
}
else 
{
    printf("bad argument '%s'\n",argv[i]);
    exit(0);
}

Когда этот код выполняется, я получаю следующую ошибку:

неверный аргумент '-n'

Я серьезно не знаю, почему это так.Может кто-нибудь объяснить?

Ответы [ 7 ]

14 голосов
/ 21 ноября 2010

Для сравнения строк нужна функция в C - обычно strcmp() из <string.h>.

if (strcmp(argv[i], "-n") == 0) 
{
    wait = atoi(argv[i + 1]);
}
else 
{
    printf("bad argument '%s'\n",argv[i]);
    exit(0);
}

Функция strcmp() возвращает отрицательное значение (не обязательно -1), если первый аргумент сортируется перед вторым; положительное значение (не обязательно +1), если первый аргумент сортируется после второго; и ноль, если два значения равны.

1 голос
/ 21 ноября 2010

Оператор == не работает с содержимым строк, поскольку строки в данном приложении фактически являются символьными указателями, а указатель сравнивается.

Для сравнения содержимого строкиспользуйте strcmp или strncmp.

0 голосов
/ 05 октября 2015
int equal(char* stringa, char* stringb) {
    while((*stringa) && (*stringb)) {
        if(*stringa!=*stringb)
            return FALSE;
        stringa++;
        stringb++;
    }
    return TRUE;
}

у меня тоже работает

0 голосов
/ 21 ноября 2010

В C оператор == сравнивает на равенство.

Значения одного и того же числового типа сравниваются простым способом (т. Е. 2 + 2 == 4 верно).

Значения различных целочисленных (и нецелых числовых) типов подвергаются некоторому преобразованию. Смотрите в другом месте.

Указатели равны, если точка находится на одном и том же адресе.

Строковые литералы помещаются в память, не перекрывая ничего другого; в том числе не перекрывая ничего, на что указывает argv [i] (для i = 0 до argc).

Итак, вы сравниваете два неравных указателя; вот почему. Вы хотите использовать if (!strcmp(argv[i], "-n")) { ... }.

0 голосов
/ 21 ноября 2010

Вы сравниваете указатели, а не содержимое строк. argv[i] и "-n" - это две разные строки, хранящиеся в двух разных местах в памяти, даже если символы внутри строк равны.

0 голосов
/ 21 ноября 2010

То, что вы действительно здесь делаете, это сравнение указателей. argv [i] не строка, это указатель на место в памяти, с которого начинается настоящая строка. Используйте strcmp ().

0 голосов
/ 21 ноября 2010

Вы сравниваете указатели (argv[i] и "-n" являются char* и const char*).

Используйте взамен strcmp().

...