Разбор аргументов из основного C++

Возможный дубликат:
C String — Использование оператора равенства == для сравнения двух строк на равенство

Основной вопрос здесь. Я компилирую эту программу в g++ и запускаю ее с одним аргументом -r (./a.out -r), однако она не выводит указанный ниже оператор cout. Что-то не так с этим кодом?

#include <string>
using namespace std;

int main(int argc, char* argv[]) {

    if (argv[1] == "-r" ) {
        cout << "First arg is -r" << endl;
    }

    return 0;
}  

person thisiscrazy4    schedule 27.11.2012    source источник


Ответы (4)


Вы не можете сравнивать строковые литералы, используя ==, потому что это сравнивает указатели (т. е. адреса памяти, которые в этом случае всегда будут разными).

Используйте strcmp или сравните std::string вместо объектов:

if (strcmp(argv[1], "-r") == 0) { ... }

or

if (std::string(argv[1]) == "-r") { ... }
person Jon    schedule 27.11.2012
comment
Это C++, а не C. Могу ли я использовать strcmp? - person thisiscrazy4; 27.11.2012
comment
@thisiscrazy4: Это потому, что вы пометили вопрос как C++. Вы все еще можете использовать strcmp в C. - person Jon; 27.11.2012
comment
Да, это С++, это я и имел в виду. - person thisiscrazy4; 27.11.2012
comment
@thisiscrazy4: Ах, моя ошибка, извините. Да, оба варианта доступны в C++. - person Jon; 27.11.2012
comment
Хорошо, это отлично работает в g++. Однако я получаю исключения потоков при компиляции в Xcode. - person thisiscrazy4; 27.11.2012

Вы не можете сравнивать строковые литералы с ==. Используйте стркмп.

(Кроме того, не забудьте проверить, что argc не меньше 2).

person Andrei Tita    schedule 27.11.2012

Одна ошибка в вашем коде заключается в том, что вы сравниваете адрес массива символов вместо того, чтобы сравнивать значения в массиве. Как говорят люди, вы можете сделать это C, используя strcmp (хотя безопаснее использовать strncmp, чтобы избежать переполнения буфера).

Однако проще использовать std::string в C++.

Я бы скопировал аргументы в вектор строк.

#include <vector>
#include <string>

int main(int argc, char* argv[])
{
    vector<string> args(argv, argv+argc);
    ...
person Peter Wood    schedule 27.11.2012

Обычно вы делаете что-то в этом роде:

while (--argc && **++argv=='-')
{
   char *p;
    p=*argv+1;
    switch(tolower(*p))
    {
        case 'r':                                       
            break;

    }
}

в основном, пока остались некоторые аргументы, проверьте, есть ли символ «-», затем включите следующий символ, чтобы увидеть модификатор («r» или «a» и т. д.)

person Daboyzuk    schedule 27.11.2012