Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как прочесть параметры с которыми запущена програ?


Автор: vood 26.7.2006, 11:41
У меня возник такой вопрос если я запущу свою программу с какаким то параметром, то как мне в ее коде получить к ним доступ? 

Автор: _hunter 26.7.2006, 11:49
в main тебе приходит число параметров argc, и сами параметры argv  

Автор: vood 26.7.2006, 11:56
_hunter, ты меня конечно извини но в этом массиве у меня передаются имена всех файлов в директории с приложением (хотя я не знаю почему; сам пробовал такое) 

Автор: Romikgy 26.7.2006, 12:05
Цитата(vood @  26.7.2006,  10:56 Найти цитируемый пост)
в этом массиве у меня передаются имена всех файлов в директории с приложение

а пример кода можно?
PS во косяк с виндой или чем?  smile  smile  

Автор: Rockie 26.7.2006, 12:16
vood, argc - кол-во параметров, по умолчанию он равен 1, а в argv[0] сидит полный путь к файлу. это параметр по умолчанию

Код
#include<iostream>
#include<conio>

using namespace std;

int main(int argc, char* argv[])
{
   cout << "argc= "<< argc<<endl;;

   for (int i=0;i<argc;i++)
    { cout<<"argv["<<i<<"]= " <<argv[i]<<endl;
    }
   getch();
   return 0;
}


попробуй запусти "твой_файл 1 2 3" 

Автор: _hunter 26.7.2006, 12:31
Цитата(vood @  26.7.2006,  11:56 Найти цитируемый пост)
в этом массиве у меня передаются имена всех файлов в директории с приложением

значит к то-то их туда пишет. попробуй запустить не из под IDE... 

Автор: ptr 26.7.2006, 12:49
vood, если пишешь под *nix, то проще и лучше будет воспользоваться getopt, getopt_long. Кстати а ты не перепутал argv и envp?

Цитата(Rockie @  26.7.2006,  16:16 Найти цитируемый пост)
а в argv[0] сидит полный путь к файлу.

Вообще-то это не совсем верно, т.к. по-умолчанию argv[0] содержит имя, по которому была вызвана программа (и это необязательно полный путь). А не по умолчанию argv[0] может содержать всё, что угодно.  

Автор: Rockie 26.7.2006, 16:19
Цитата(ptr @  26.7.2006,  12:49 Найти цитируемый пост)
Вообще-то это не совсем верно, т.к. по-умолчанию argv[0] содержит имя, по которому была вызвана программа (и это необязательно полный путь).

ptr, а можно пример в каких случаях нет полного пути?

 

Автор: Rockie 26.7.2006, 16:45
vood, а компилятор не BC?
 

Автор: Romikgy 26.7.2006, 16:46
хоть я и не 
Цитата(Rockie @  26.7.2006,  15:19 Найти цитируемый пост)
ptr

попробуй запустить из реестра или из назначения заданий или через выполнить... 

Автор: NextAlex 26.7.2006, 21:00
Цитата(vood @  26.7.2006,  11:56 Найти цитируемый пост)
 в этом массиве у меня передаются имена всех файлов в директории с приложением

извини за дурацкий вопрос, но с каким аргументом ты запускаешь прогу ?
Код

#include <stdio.h>

int main(int argc, char* argv[]){
    if (argc > 0){
        for (int i = 0; i < argc; i++){
            printf("%s\n", argv[i]);
        }
    }
}

при запуске такого кода с аргументом *,  как раз и получается список всего содержимого директории
это старый прикол и на форуме это было 

Автор: Romikgy 26.7.2006, 21:46
Цитата(NextAlex @  26.7.2006,  20:00 Найти цитируемый пост)
при запуске такого кода с аргументом *,  как раз и получается список всего содержимого директории
это старый прикол и на форуме это было  

Гы а я не знал , надо будет поковырять smile 

Автор: ptr 27.7.2006, 05:05
Цитата(Rockie @  26.7.2006,  20:19 Найти цитируемый пост)
ptr, а можно пример в каких случаях нет полного пути?

Вот примеры (из командной строки вызывается test.exe):
Код

call TeSt.ExE

call test

call .\..\test.exe

call .\..\test


Цитата(Romikgy @  26.7.2006,  20:46 Найти цитируемый пост)
попробуй запустить из реестра или из назначения заданий или через выполнить...  

Из назначенных и через выполнить полный путь будет в argv[0].   

Автор: NextAlex 27.7.2006, 08:42
Romikgy, я уже ковырял - прикольная тема
можно получать список файлов по маске - круче чем стандартный dir  smile 

Автор: vood 27.7.2006, 11:57
компилятор Dev C++
пишу под винду
параметр передаю строковый 

Автор: Rockie 27.7.2006, 16:57
ptr,  может быть дело в системе, у меня при 
Цитата(ptr @  27.7.2006,  05:05 Найти цитируемый пост)
call test (start test)
 все равно полный путь пишется.. остальное так не запускается..  smile  

Автор: ptr 28.7.2006, 06:26
Цитата(Rockie @  27.7.2006,  20:57 Найти цитируемый пост)
остальное так не запускается..  smile   

В смысле?

Цитата(Rockie @  27.7.2006,  20:57 Найти цитируемый пост)
может быть дело в системе,

Не только в системе, но и командном интерпретаторе.

Цитата(vood @  27.7.2006,  15:57 Найти цитируемый пост)
компилятор Dev C++
пишу под винду
параметр передаю строковый  

А исходник можно? 

Автор: apook 28.7.2006, 11:31
Если переделать код vooda вот так

Код

#include "iostream.h"
#include "conio.h"

using namespace std;

int main(int argc, char* argv[])
{
char *buf;
cout << "argc= " << argc << endl;

for (int i=0; gets(buf) != NULL; i++)
     {
      cout << "argv[" << i << "]= " << buf << endl;
          }
   getch();

return 0;
     }

и запустить из коммандной строки: 
dir C: | test.exe
то получится именно тот эффект
Получается что функция getargv(или как там она называется _getargv) 
проделывает что-то подобное ? Но с чего-ради 

Автор: ptr 28.7.2006, 15:19
Для начала ты забыл выделить память smile .

Цитата(apook @  28.7.2006,  15:31 Найти цитируемый пост)
то получится именно тот эффект
Получается что функция getargv(или как там она называется _getargv) 
проделывает что-то подобное ? Но с чего-ради 

Что за эффект? Не понял.  

Автор: NextAlex 28.7.2006, 19:32
vood, выложил бы код уже помогли бы
слова "строковый параметр" не говорят ничего - он не может быть другим 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)