Пишу консольную прогу на чистом Cи.
Нужно сделать вызов внешней программы proga.exe из своей с ключом -s и с
параметром этой программы.
То есть функцией system(). Примерно так:
system("proga.exe -sПАРАМЕТР file.txt "). ПАРАМЕТР записыватся с ключом -s
слитно.
Мне надо этот ПАРАМЕТР менять в цикле (счетчиком). Например счетчик у нас будет
i , а цикл вертится 10 раз. Получается:
system("proga.exe -si file.txt ")
Проблемы:
1) Счетчик сливается с ключом
2) Внутри функции system() счетчик не виден, даже если он ни с чем не
сливается.
Проверил путем вызова system("echo i")
Выводится "echo i" 10 раз вместо вывода
echo 0
echo 1
echo 2
....
echo 10
Как передать значение счетчика в вызов функции?
Bye.
Даниил.
04 Oct 07 23:45, you wrote to All:
dk> Пишу консольную прогу на чистом Cи.
dk> Нужно сделать вызов внешней программы proga.exe из своей с ключом -s и
dk> с параметром этой программы. То есть функцией system(). Примерно так:
dk> system("proga.exe -sПАРАМЕТР file.txt "). ПАРАМЕТР записыватся с
dk> ключом -s слитно. Мне надо этот ПАРАМЕТР менять в цикле (счетчиком).
dk> Например счетчик у нас будет i , а цикл вертится 10 раз.
dk> Получается: system("proga.exe -si file.txt ")
dk> Проблемы:
dk> 1) Счетчик сливается с ключом
dk> 2) Внутри функции system() счетчик не виден, даже если он ни с чем не
dk> сливается. Проверил путем вызова system("echo i") Выводится "echo i"
dk> 10 раз вместо вывода echo 0 echo 1 echo 2
dk> ....
dk> echo 10
dk> Как передать значение счетчика в вызов функции?
char command[100];
int i;
for (i=0;i;<10;i++) {
sprintf(cmd, "echo %d\n", i);
system(cmd);
}
Voice Phones: 972-4-8330554 (home), 972-5-4481073 (cell)
Bye ! [Team Intel Centrino Technology]
Stanislav (AKA Night's Man) [Team Technion]
DK>> Как передать значение счетчика в вызов функции?
SS> char command[100];
SS> int i;
SS> for (i=0;i;<10;i++) {
SS> sprintf(cmd, "echo %d\n", i);
SS> system(cmd);
SS> }
Спасибо! Все получилось!
Я совсем про sprintf() забыл... :)
Bye .
Даниил.
On Thu, 04 Oct 07 22:35:27 +0300; Stanislav Shwartsman
<Stanislav_...@f520.n400.z2.fidonet.org> wrote about 'вызов внешней
программы из своей с параметрами':
SS> sprintf(cmd, "echo %d\n", i);
SS> system(cmd);
Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().
P.S. Автору изначального поста - лучше пока на Си вообще не писать.
--
With best regards,
Andy Shevchenko. mailto: an...@smile.org.ua
SS>> sprintf(cmd, "echo %d\n", i);
SS>> system(cmd);
AS> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().
Ну-ка, расскажи, и как ты этими дырами воспользуешься, крутой мега-кракер? :)
AS> P.S. Автору изначального поста - лучше пока на Си вообще не писать.
Да ну? Почему?
Bye .
Даниил.
05 Oct 07 09:23, you wrote to me:
SS>> sprintf(cmd, "echo %d\n", i);
SS>> system(cmd);
AS> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().
AS> P.S. Автору изначального поста - лучше пока на Си вообще не писать.
А на чем ему писать ?
Думаю он не коммерческую прогу пишет, чтобы кого-то эти дыры в
безопасности волновали :)
Меня точно не волнуют :)
SS>> sprintf(cmd, "echo %d\n", i);
SS>> system(cmd);
AS> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().
Дырами они являются только в том случае, если их аргумент каким-то образом
зависит от действий пользователя.
С приветом, Шурик Гребеньков. e-mail: grebenkov [не собака] gmail dot com
On Fri, 05 Oct 07 17:05:32 +0300; Stanislav Shwartsman
<Stanislav_...@f520.n400.z2.fidonet.org> wrote about 'вызов внешней
программы из своей с параметрами':
SS>>> sprintf(cmd, "echo %d\n", i);
SS>>> system(cmd);
AS>> Угу, и стало вместо одной дыры system() уже 2 - system() + sprintf().
AS>> P.S. Автору изначального поста - лучше пока на Си вообще не писать.
SS> А на чем ему писать ?
Hа простых и понятных языках. Типа python.
SS> Думаю он не коммерческую прогу пишет, чтобы кого-то эти дыры в
SS> безопасности волновали :)
Вот так и имеем в конечном продукте дыры.
Есть класс функций, которые самое натуральное табу:
str* (без n или l),
sprintf,
system
и т.д.
Лучше от их использования сразу отказаться, чем потом искать из-за чего же
нашу супер-пупер программу ломанули или она просто упала.
P.S. Си - язык профи, а не новичков.
В Си очень легко напортачить в отличие даже от Си++.
AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,
просто вы не умеете их готовить! ;)
--
john, http://john.kak-sam.to
On Sun, 07 Oct 07 12:21:58 +0300; john gladkih <jo...@gladkih.com> wrote about
'Re: вызов внешней программы из своей с параметрами':
AS>> Есть класс функций, которые самое натуральное табу:
AS>> str* (без n или l),
AS>> sprintf,
jg> просто вы не умеете их готовить! ;)
Да умеем, но чаще бабло побеждает зло.
AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,
jg> просто вы не умеете их готовить! ;)
AS> Да умеем, но чаще бабло побеждает зло.
если бы умели, то никогда бы в приличном обществе не упопинали
'n' варианты, это еще большее зло
--
john, http://john.kak-sam.to
On Mon, 08 Oct 07 10:37:14 +0300; john gladkih <jo...@gladkih.com> wrote about
'Re: вызов внешней программы из своей с параметрами':
AS>> Есть класс функций, которые самое натуральное табу:
AS>> str* (без n или l),
AS>> sprintf,
jg>> просто вы не умеете их готовить! ;)
AS>> Да умеем, но чаще бабло побеждает зло.
jg> если бы умели, то никогда бы в приличном обществе не упопинали
jg> 'n' варианты, это еще большее зло
Согласен, что n-вариант без дополнительных телодвижений даёт некую
"видимость безопасности" в ущерб функциональности (или я ошибаюсь?).
AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,
jg> просто вы не умеете их готовить! ;)
AS> Да умеем, но чаще бабло побеждает зло.
jg> если бы умели, то никогда бы в приличном обществе не упопинали
jg> 'n' варианты, это еще большее зло
AS> Согласен, что n-вариант без дополнительных телодвижений даёт некую
AS> "видимость безопасности" в ущерб функциональности (или я ошибаюсь?).
результат работы той же strncpy абсолютно неизвестен, она ж даже
0 не пишет при превышении длинны. то есть нет даже видимой "безопасности"
--
john, http://john.kak-sam.to
On Tue, 09 Oct 07 21:52:13 +0300; john gladkih <jo...@gladkih.com> wrote about
'Re: вызов внешней программы из своей с параметрами':
AS>> Есть класс функций, которые самое натуральное табу:
AS>> str* (без n или l),
AS>> sprintf,
jg>> просто вы не умеете их готовить! ;)
AS>> Да умеем, но чаще бабло побеждает зло.
jg>> если бы умели, то никогда бы в приличном обществе не упопинали
jg>> 'n' варианты, это еще большее зло
AS>> Согласен, что n-вариант без дополнительных телодвижений даёт некую
AS>> "видимость безопасности" в ущерб функциональности (или я ошибаюсь?).
jg> результат работы той же strncpy абсолютно неизвестен, она ж даже
jg> 0 не пишет при превышении длинны. то есть нет даже видимой "безопасности"
Легче пользовать strncat.
char *x;
...
x = (char *) malloc(sizeof(char) * len + 1);
if (NULL == x) return -1;
x[0] = 0;
strncat(x, y, len);
...
В случае strncpy меняется порядок:
...
strncpy(x, y, len);
x[len] = 0;
...
Понятно, что в реальной жизни надо бы ещё проверить всё ли из y уместилось в
x. В зависимости от критичности кода что-то делать.
AS> Есть класс функций, которые самое натуральное табу:
AS> str* (без n или l),
AS> sprintf,
jg> просто вы не умеете их готовить! ;)
AS> Да умеем, но чаще бабло побеждает зло.
jg> если бы умели, то никогда бы в приличном обществе не упопинали
jg> 'n' варианты, это еще большее зло
AS> Согласен, что n-вариант без дополнительных телодвижений даёт некую
AS> "видимость безопасности" в ущерб функциональности (или я ошибаюсь?).
jg> результат работы той же strncpy абсолютно неизвестен, она ж даже
jg> 0 не пишет при превышении длинны. то есть нет даже видимой "безопасности"
AS> Легче пользовать strncat.
AS> char *x;
AS> ...
AS> x = (char *) malloc(sizeof(char) * len + 1);
AS> if (NULL == x) return -1;
AS> x[0] = 0;
AS> strncat(x, y, len);
AS> ...
AS> В случае strncpy меняется порядок:
AS> ...
AS> strncpy(x, y, len);
AS> x[len] = 0;
AS> ...
бр... если известен len и делаешь malloc(), то 'n' варианты
вообще не нужны.
--
john, http://john.kak-sam.to