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


Автор: hexzo 4.10.2011, 16:57
Можно ли получить не распарсенную на массив значений строку, которая пишется после исполняемого файла программы в командной строке.

Автор: math64 4.10.2011, 18:54
Начинай программу не с main(), а с WinMain() (для Windows)

Автор: borisbn 4.10.2011, 19:24
Сконкатинируй все argv, кроме 0-го в одну строку

Автор: math64 4.10.2011, 20:14
Цитата(borisbn @  4.10.2011,  19:24 Найти цитируемый пост)
Сконкатинируй все argv, кроме 0-го в одну строку

Между аргументами есть пробелы - число их может быть разным, и это может быть важно.  

Автор: borisbn 4.10.2011, 20:34
math64, 
1. Не очень себе представляю ситуацию, где было бы важно кол-во пробелов между параметрами
2. В консольном приложении в Windows можно заюзать WinMain ? (Щаз без сарказма - действительно не знаю)
3. Как быне не в Windows ?

Автор: Alca 4.10.2011, 20:48
Ось какая?

Добавлено через 6 минут и 59 секунд
Windows:
    ::GetCommandLine();

Linux:
    "/proc/self/cmdline"

Автор: hexzo 5.10.2011, 09:22
Alca Спасибо за вариант с вин апи, думаю он самый подходящий.

borisbn
Цитата

1. Не очень себе представляю ситуацию, где было бы важно кол-во пробелов между параметрами

Я тоже не очень представляю себе все такие ситуации, потому что они непредсказуемые.
Баг может быть связан со служебными символами, всякими ушками, кавыками. Одиночное ушко самоаннигилируется, пытаясь экранировать следующий символ. Пара ушек попадает в аргумент как одно.  Или , например, если поставить в качестве аргумента звёздочку, то парсер мне любезно предоставит в аргументах имена всех файлов в каталоге, вместо моей звёздочки, что мне нафиг не надо.

Автор: borisbn 5.10.2011, 09:44
Цитата(hexzo @  5.10.2011,  09:22 Найти цитируемый пост)
если поставить в качестве аргумента звёздочку, то парсер мне любезно предоставит в аргументах имена всех файлов в каталоге, вместо моей звёздочки

 smile 

Автор: newbee 5.10.2011, 09:54
Цитата(hexzo @  5.10.2011,  10:22 Найти цитируемый пост)
то парсер мне любезно предоставит в аргументах имена всех файлов в каталоге, вместо моей звёздочки, что мне нафиг не надо
Ну на самом деле это шел аргументы разбивает и подставляет вместо звездочек файлы, экранирует всякие символы, объединяет параметры, объединенные кавычками в один аргумент и прочая, и прочая. Не скажу, как в винде, но в линуксе в /proc/$(pidof program)/cmdline ты увидишь уже "распарсенный" вариант аргументов.

Автор: hexzo 5.10.2011, 10:02
Решение.
Код

WCHAR* cmds = GetCommandLine();  
QString str = QString::fromWCharArray(cmds);
qDebug()<<str;


newbee
Цитата

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

А откуда тогда тогда функция GetCommandLine() берёт строку?

Автор: borisbn 5.10.2011, 10:03
Не понимаю, о чём вы говорите...
Код

#include <iostream>

int main(int argc, char *argv[])
{
    for ( int i = 1; i < argc; i++ )
    {
        std::cout << argv[ i ] << std::endl;
    }
}

Цитата

D:\Work\QProjects\console\Debug>console.exe ' \n *
'
\n
*

Автор: newbee 5.10.2011, 10:36
Цитата(hexzo @  5.10.2011,  11:02 Найти цитируемый пост)
А откуда тогда тогда функция GetCommandLine() берёт строку? 
Хз, может из астрала. Это ж винда, я про линукс сказала.

Добавлено через 3 минуты и 15 секунд
borisbn, об этом:
Код

int main(int argc,char **argv){
 while(argc-->0)
  printf("%s\n",argv[argc]);
 return 0;}


Цитата

./test *
types.cpp
types
tmp
thread.c
test_textfile
test.s
test.h
test.cpp
test2.s
test2.c
test2
test
tco.s
tco.cpp
tco2.s
tco1.s
tco
struct.cpp
struct
string
stdin.c
stdin
split.cpp
split
speed
sort_cxx
sort.cpp
sort.c
sort_c
so
sig.c
sig
sh
qt
ptr.cpp
ptr
pragma.h
pragma.cpp
pragma
pktparse
pipe.c
pipe
parser.c
parser
namespace.cpp
namespace
makefile.tar
makefile
macro.c
macro
list.cpp
list
liblib.so
lib.cpp
lib
jmp.c
input.cpp
input
hello.cpp
hello.back
hello
find.c
find
filename
file.cpp.orig
file.cpp
file.c
filec
file
div.c
div
delete.cpp
delete
date.c
date
break.cpp
break
bin.cpp
bin
b.c
a.out
alloc.cpp
alloc
a.c
a9.cpp
a9
a


Автор: mes 5.10.2011, 12:31
 smile 
Цитата(newbee @  5.10.2011,  09:36 Найти цитируемый пост)
 while(argc-->0)

красиво выглядит строчка, как будто новый оператор -->  smile .. никогда раньше не замечал... 

Автор: newbee 5.10.2011, 13:50
 smile 
mes, это новый оператор, читается так: argc стремится к нулю. Математики, не бейте)) Сначала хотела выложить более очевидный вариант с рекурсивным main, но решила никого не шокировать. А вон оно как получилось.

Автор: azesmcar 5.10.2011, 13:54
Цитата(mes @  5.10.2011,  12:31 Найти цитируемый пост)
красиво выглядит строчка, как будто новый оператор -->  smile .. никогда раньше не замечал... 

Вопрос удостоился рейтинга 800 на SO smile 
http://stackoverflow.com/questions/1642028/what-is-the-name-of-this-operator

Автор: mes 5.10.2011, 13:58
smile 
Цитата(newbee @  5.10.2011,  12:50 Найти цитируемый пост)
это новый оператор, читается так: argc стремится к нулю

для положительных.. а для отрицательных  можно применить крокодила : ++<
 smile

Добавлено через 3 минуты и 30 секунд
Цитата(azesmcar @  5.10.2011,  12:54 Найти цитируемый пост)
Вопрос удостоился рейтинга 800 на SO  

  smile 

Автор: borisbn 5.10.2011, 15:57
Цитата(azesmcar @  5.10.2011,  13:54 Найти цитируемый пост)
Вопрос удостоился рейтинга 800 на SO

user posted image smile 

Автор: boostcoder 5.10.2011, 17:00
это все керня, а мне вот интересно, что у newbee в файлах types.cpp, tco.cpp, namespace.cpp, file.cpp.orig ;)

зы
newbee, у тебя в "доме" типичный бабский бардак smile 


Добавлено через 7 минут и 21 секунду
стало интересно, у кого что в доме лежит?
у меня:

user@user-pisi:~$ ls -l
drwxrwxr-x  8 user user-pisi   4096 2011-09-10 18:55 asio-samples
drwxr-xr-x  9 user user-pisi   4096 2011-10-04 11:40 boost-trunk
-rw-r--r--  1 user user-pisi  20170 2011-06-17 05:25 constexpr.cpp
-rw-r--r--  1 user user-pisi   2189 2011-09-24 18:13 coroutine.hpp
drwxr-xr-x  2 user user-pisi   4096 2011-09-24 02:13 Desktop
-rwxrwx---  1 user user-pisi  20750 2011-08-05 14:08 gcc_build3.sh
-rwxr--r--  1 user user-pisi  11139 2011-07-13 17:10 gcc_build.sh
-rw-r--r--  1 user user-pisi 663052 2011-09-21 12:35 libjson_7.4.0.zip
-rw-r--r--  1 user user-pisi    642 2011-10-04 22:33 ltotest.tar.gz
-rw-r--r--  1 user user-pisi   1021 2011-07-22 18:35 main2.cpp
-rw-r--r--  1 user user-pisi    331 2011-09-24 21:55 main3.cpp
-rw-r--r--  1 user user-pisi   1927 2011-07-23 00:37 main4.cpp
-rw-r--r--  1 user user-pisi   1196 2011-10-01 18:16 main5.cpp
-rw-rw----  1 user user-pisi   1902 2011-10-04 02:20 main.c
-rw-r--r--  1 user user-pisi 467498 2011-10-04 04:26 out.hpp
-rw-r--r--  1 user user-pisi  31011 2011-06-12 20:39 post2.txt
-rw-rw----  1 user user-pisi   8049 2011-08-16 21:11 post.txt
drwxrwxr-x 83 user user-pisi   4096 2011-10-01 19:23 projects
drwxrwxr-x 11 user user-pisi   4096 2011-09-25 23:49 schroedinger
drwxrwxr-x  7 user user-pisi   4096 2011-09-09 11:49 soci
drwxrwxr-x  8 user user-pisi   4096 2011-09-09 11:49 tests
-rw-rw----  1 user user-pisi 408865 2011-01-26 03:37 words.txt

Автор: newbee 5.10.2011, 19:16
boostcoder, это не в доме, а в ~/devel/tests. В tco что-то про хвостовую рекурсию, я тут на форуме вопрос задавала, namespace и types - борьба с языком, files - испытывала разные posix/linux флаги работы с файлами и epoll-ами. А в доме лежат docs, pics, video, devel, stuff и старые колготки.

Автор: boostcoder 5.10.2011, 22:03
newbee, это все просто детский подкол ;)

Добавлено через 1 минуту и 19 секунд
желающих поделится информацией о лежащих в доме файлах, нашлось не так уж и много.

"какие все серьезные"

Автор: volatile 5.10.2011, 23:30
Цитата(newbee @  5.10.2011,  13:50 Найти цитируемый пост)
это новый оператор, читается так: argc стремится к нулю

пусть лучше стремится в другую стророну

Код

while(0 <-- argc)
    printf("%s\n",argv[argc]);

потомучто borisbn, не выводил 0-го элемента
Цитата(borisbn @  5.10.2011,  10:03 Найти цитируемый пост)
 for ( int i = 1; 

и мы не будем... smile 

Автор: newbee 5.10.2011, 23:44
volatile, не-не-не, демон, не ломай семантику! Давай просто устремим argc к единице? Конечно не так канонично, но что поделать, раз boribn паршивец не удосужился нулевой элемент вывести (((

Автор: borisbn 6.10.2011, 00:00
volatile, newbee, я практически всегда помню, как меня зовут, поэтому и начал с 1-цы. Вот если забуду, кто я есть такой, вто тогда argv[ 0 ] в помощь

Автор: borisbn 6.10.2011, 01:01
Цитата(boostcoder @  5.10.2011,  22:03 Найти цитируемый пост)
желающих поделится информацией о лежащих в доме файлах, нашлось не так уж и много.

Интерны, TBBT, Megadeth, Metallica, Helloween, Total Commander, Opera, Chrome, QIP.
Private-секцию не покажу smile

Автор: boostcoder 6.10.2011, 01:04
Цитата(borisbn @  6.10.2011,  01:01 Найти цитируемый пост)
Private-секцию не покажу

у всех она есть! smile 

Автор: borisbn 6.10.2011, 01:04
Чего-то "социальщиной" запахло. Щаз свиттеры и мордокниги пойдут smile

Автор: newbee 6.10.2011, 01:08
Мегадэс, митолика  smile  Лучше бы ты вообще ничего не показывал))

Цитата(borisbn @  6.10.2011,  01:00 Найти цитируемый пост)
я практически всегда помню, как меня зовут, поэтому и начал с 1-цы. Вот если забуду, кто я есть такой, вто тогда argv[ 0 ] в помощь 
Правилом хорошего тона является то, что программа не знает, как ее зовут.

Автор: volatile 6.10.2011, 01:34
Цитата(boostcoder @  5.10.2011,  22:03 Найти цитируемый пост)
поделится информацией о лежащих в доме файлах, нашлось не так уж и много

Раз уж пошел такой откровенный оффтоп, и чтоб разрядить несколько обсановку, (программеры по-ходу к вечеру утомились), выкладываю фото своего рабочего стола...
http://radikal.ru/F/i020.radikal.ru/1110/ca/80263345df61.jpg.html
--
шютка, конечно... smile 

Автор: boostcoder 6.10.2011, 02:02
volatile, так принтер нужно было крупным планом! принтер!!!

Добавлено через 32 секунды
повторюсь... но завтра нас накажут.

Автор: fish9370 6.10.2011, 09:50
Цитата(newbee @  5.10.2011,  10:36 Найти цитируемый пост)
argc-->0


за такую запись по шапке бы дал..

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