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

  • Автор темы SiNn3R
  • Дата начала
S

SiNn3R

#1
Вопрос 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
 

grigsoft

Well-known member
15.11.2005
735
0
#2
чем отличается int _tmain(int argc, _TCHAR* argv[])
Во это должно помочь. Все _t* функции - это просто define's которые раскрываются в зависимости от использования юникода.

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

Как делают, чтобы прграмма понимала, какой аргумент ей скармливают, вне зависимости от его положения в запросе?
Нормальной логикой программы - когда каждый аргумент проходит через сито сравнений.
 
S

SiNn3R

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

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

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

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

grigsoft

Well-known member
15.11.2005
735
0
#4
примерно так:
Код:
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);
}