Пара вопросов по Argc и Argv в Main

Тема в разделе "MS Visual C++", создана пользователем SiNn3R, 10 сен 2008.

  1. SiNn3R

    SiNn3R Гость

    Вопрос 1:
    Чем отличается int _tmain(int argc, _TCHAR* argv[])
    от int main(int argc, char* argv[])

    Вопрос 2:
    В int main(int argc, char* argv[]) argv[] принимает полное имя аргумента, а в int _tmain(int argc, _TCHAR* argv[]) только 1 букву. Как правильно считывать аргументы в int _tmain(int argc, _TCHAR* argv[])?

    Вопрос 3:
    Как делают, чтобы прграмма понимала, какой аргумент ей скармливают, вне зависимости от его положения в запросе?
    Например: app.exe -d -g -r то же, что и app.exe -g -r -d
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Во это должно помочь. Все _t* функции - это просто define's которые раскрываются в зависимости от использования юникода.

    А как ты узнал что буква только одна? Скорее всего ты включил юникод, а с аргументами работаешь простыми функциями. Тогда strlen(argv[0])==1, а вот _tcslen(argv[0]) даст правильный результат.
    Просто почитай про поддержку юникода в С++.

    Нормальной логикой программы - когда каждый аргумент проходит через сито сравнений.
     
  3. SiNn3R

    SiNn3R Гость

    Большое спасибо!

    Я так понимаю, сначала все параметры сравниваются с 1 командой, потом со 2 и т.д. (с помощью цикла).

    А вот как делают, если например есть следующее:
    app.exe -a -add output.txt -b

    -add проверяется циклом, а вот как сделать, чтобы следующая часть (output.txt) воспринималась, как принадлежность к -add?
     
  4. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    примерно так:
    Код (Text):
    void HandleParam(LPCTSTR sParam, BOOL bFlag)
    {
    if (bFlag)  // handle flags first
    {
    if (_tcsicmp(sParam, _T("a"))==0)
    fCmd |= FLAG_A;
    else if (_tcsicmp(sParam,_T("b"))==0)
    fCmd |= FLAG_B;
    else if (_tcsicmp(sParam, _T("add"))==0)
    fCmd |= FLAG_ADD;
    return;
    }
    // handle string params
    if ( (fCmd & FLAG_ADD) && !szAddCmd)
    szAddCmd = sParam;
    else
    szFile = sParam;
    }

    ...
    for (int i=1; i<argc; i++)
    {
    BOOL bFlag = FALSE;
    LPTSTR szParam = argv[i];
    if (szParam[0]=='-' || szParam[0]=='/')
    {
    bFlag = TRUE;
    szParam++;
    }
    HandleParam(szParam, bFlag);
    }
     
Загрузка...

Поделиться этой страницей