2013-08-19 4 views
-3

Я пытаюсь разбор Заурядных аргументов в моем консольном приложении с этим кодом:аргументов разбор ошибки

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    if(argv[1] == _T("arg1")) cout<<"Argument1 was passed"; 
    _getch(); 
    return 0; 

} 

Моего код не работает. Я имею в виду, он работает, но консоль пуста. Я компилирую с опцией Use Unicode Character Set в Visual Studio 2012 (в Windows 7). Где моя ошибка ?!

+0

Вы должны использовать '<< std :: endl' после написания вашего вывода, чтобы гарантировать сброс' std :: cout' BTW. –

ответ

8

Использование strcmp для сравнения char массивы

if(strcmp(argv[1], "arg1") == 0) 

== Использование только сравнивает указатели на двух разных строках. Ответ

знакомства Дария Kucinskas' для сравнения _TCHAR массивов

+0

Я использую '_TCHAR *' – Victor

+0

@Victor Я обновил, чтобы показать, как сравнивать 'argv [1]' с строкой ascii. Ответ Дария Кучинскаса указывает на эквивалентную функцию для '_TCHAR' – simonc

+0

Это работает, если он фактически передает что-то в командной строке. Если он просто запускает программу (без аргументов командной строки), поведение не определено (он пытается получить доступ к концу массива). –

5
if (_tcscmp(argv[1], _T("arg1")) == 0) { 
    cout << "Argument1 was passed" << endl; 
} 
+0

+1. Я пропустил использование '_TCHAR' – simonc

+0

@simonc да, но вы были первыми;) –

0

У вас есть несколько ошибок:

1) Вы не можете сравнивать строки C-стиля (символьные массивы) с помощью оператора ==. argv[#] - массив символов, равно _T("some value"). Чтобы сравнить их, вам необходимо использовать strcmp (или один из его двоюродных братьев) или сохранить его в std::string.

2) Вы пытаетесь получить доступ к 2-му элементу массива, но существует только один элемент. вы сказали, что ничего не передаете на вызов, то есть argv[0] будет содержать данные (имя исполняемого файла, который вы используете), но argv[1] не будет. В общем случае попытка доступа к нему будет пытаться получить доступ к данным вне диапазона массива с неопределенными результатами. В этом конкретном случае стандарт (раздел 3.6.2) утверждает, что он всегда будет 0 (иначе NULL). Таким образом, ваше условие всегда будет ложным.

3) Вы должны ВСЕГДА проверять значение argc, если ожидаются параметры командной строки.

Смежные вопросы