Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / argc и argv / 19 сообщений из 19, страница 1 из 1
04.02.2014, 10:16
    #38548142
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Здравствуйте.
Перечитывал вчера вечером, и встретил
Диомидис Спинеллис "Анализ программного кода на примере Open Sourse"В языках С,С++ для передачи информации из операционной системы через командную строку в программу служат два аргумента функции main. По традиции эти аргументы носят имена argc и argv. Переменная argc содержит количество аргументов программы, а переменная argv - это массив строк, содержащий сами аргументы(в том числе имя самой программы в нулевой позиции). Массив argv заканчивается элементом NULL. Благодаря этому возможны два способа перебора строки аргументов: во-первых, отсчитывать их количество в соответствии со значением argc; во-вторых, сравнивать строки в массиве argv со значением NULL.

Помнил это, и всё понятно.

Возникают два вопроса.
1. Не избыточен ли параметр argc ? И аргументируйте пожалуйста любой ответ
2. Возникали ли проблемы связанные с безопасностью, в результате этой избыточности ? Если да, то какие

Спасибо
...
Рейтинг: 0 / 0
04.02.2014, 11:06
    #38548210
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
когда вы видели, чтобы програмиста, пишущего на плюсах, волновали проблемы с безопасностью? Хоттите безопасности - пишите на java.
...
Рейтинг: 0 / 0
04.02.2014, 11:25
    #38548230
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
авторВозникают два вопроса.
1. Не избыточен ли параметр argc ? И аргументируйте пожалуйста любой ответ


Нет. Нужно знать размер этого массива argv, кол-во элементов в нём.
Можно было бы завершать его нулевым элементом (нулевым указателем), но
сделали не так, а наоборот, дали ещё один параметр -- размер массива.

автор2. Возникали ли проблемы связанные с безопасностью, в результате этой избыточности ? Если да, то какие


Я думаю, в силу наличия ответа на первый вопрос второй вопрос бессмысленен.
Там нет никаких проблем безопасности, если что.

P.S. SashaMercury , мне кажется, проблемы у тебя с другим -- слишком много думаешь... Простая же вещь...
...
Рейтинг: 0 / 0
04.02.2014, 14:10
    #38548603
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
MasterZivМожно было бы завершать его нулевым элементом (нулевым указателем), но
сделали не так

именно так и сделали. завершается нулевым элементом, поэтому argc можно легко посчитать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <stdio.h>

int main(int argc, char** argv){
    int i=0;
    while(argv[i]!=0){
	i++;
    }
    printf("%d %d \n", argc, i);
}



Но это сейчас можно судить где они облажались, а где нет. А в ТО время не было никакого си, и хоть какой-то си, с хоть какими-то либами, был лучше, чем вообще ничего. При этом не было таких шибко умных грамотеев, как мы тут сидим, которые могли б навскидку правильно сказать, что вот так делать не надо, а вот так надо.
...
Рейтинг: 0 / 0
04.02.2014, 14:30
    #38548655
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
chabapokА в ТО время не было никакого си
В ТО время параметр argv не заканчивался NULL-ом. Это более поздняя защита от дураков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.02.2014, 14:48
    #38548684
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Как-то мы про env забыли. А чё с ним. Опасен?

Код: plaintext
1.
void main(int argc, char *argv[], char *env[]){...}



Ах! Как неудобно! Мы совсем про Печкина забыли (с) Суровая тётка в очках
...
Рейтинг: 0 / 0
04.02.2014, 14:52
    #38548692
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
maytonКак-то мы про env забыли. А чё с ним. Опасен?


Уууу.. ещё как !
Можно ненароком прочитать какую-нибудь переменную окружения...
...
Рейтинг: 0 / 0
04.02.2014, 15:16
    #38548749
Сергей Силкин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
MasterZivSashaMercury , мне кажется, проблемы у тебя с другим -- слишком много думаешь... Простая же вещь...Правильно делает парень, что много думает и может быть наивные вопросы задаёт.

Я уже давно заметил простую вещь (хотя для кого-то и не очевидную). Кто в профессии (в любой) достигает успеха? Не обязательно гении, вундеркинды и пр. Ну, конечно, такие безусловно. Но и не только такие. Также успехов в профессии достигает тот, у кого может быть скромные способности, но есть сильная мотивация в том, чтобы во всём разобраться досконально . Т.е. для таких людей «второстепенных», а уж тем более «десятистепенных» вопросов просто нет. Если надо в чём-то разобраться, то все аспекты проблемы – только первостепенной важности, в которых надо разобраться не «как-нибудь», а именно досконально. Вот такие люди и достигают успеха в профессии.

Так что молодец парень, что задаёт наивные вопросы – пускай дерзает!
...
Рейтинг: 0 / 0
04.02.2014, 15:27
    #38548781
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Сергей СилкинПравильно делает парень, что много думает и может быть наивные вопросы
задаёт.
Дык проблема как раз в том, что он думает недостаточно много. Подумал бы ещё чуть-чуть и
ответ на вопрос пришёл бы сам собой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.02.2014, 15:42
    #38548820
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Сергей СилкинПравильно делает парень, что много думает и может быть наивные вопросы задаёт.

Конечно, правильно... Это почти шутка была...
...
Рейтинг: 0 / 0
26.02.2014, 09:35
    #38572444
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#include "stdafx.h"
int _tmain(int argc, char* argv[]) //_TCHAR
{
	//1
	int i = 0;
	while (*argv)
	{
		printf("%s \n", *argv++);
	}
	printf("%i \n\n", argc);

	//2
	char* m[12] =
	{ "jaunary", "february", "march", "april", "may", "june",
	"july", "august", "september", "october", "nobember", "december"
	};
	int j = 0;
	while (j<12)
	{
		printf("%s \n", *(m+j));
		++j;
	}

	return 0;
}




Когда запускаю программу через командную строку, первая часть кода выводит только первые символы массива argv. Аналогичный код ниже отрабатывает нормально. Что-то упустил, или забыл. Подскажите пожалуйста
...
Рейтинг: 0 / 0
26.02.2014, 09:37
    #38572447
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
И я удивился что argc =4, я думал что 1 элемент имя программы, плюс три параметра запуска, плюс 1 на \0. Рассчитывал на пять элементов
...
Рейтинг: 0 / 0
26.02.2014, 10:15
    #38572485
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
SashaMercury плюс 1 на \0
это для защиты от выхода за пределы массива при подобном переборе. В argc этот пустой элемент не учитывается.
...
Рейтинг: 0 / 0
26.02.2014, 11:35
    #38572637
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Больше похоже на два перевода строки как в http протоколе.
...
Рейтинг: 0 / 0
26.02.2014, 12:01
    #38572681
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
SashaMercury,

Твоя прога:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
#include "stdio.h"
#include "stdlib.h"

int main(int argc, char* argv[])
{
  //1                                                                                                                                                                                                               
  int i = 0;
  printf("argc = %i\n\n", argc);
  while (*argv)
    {
      printf("%s\n", *argv++);
    }
  printf("\n\n//2\n\n");

  //2                                                                                                                                                                                                               
  const char* m[12] =
    { "jaunary", "february", "march", "april", "may", "june",
      "july", "august", "september", "october", "nobember", "december"
    };
  int j = 0;
  while (j<12)
    {
      printf("%s \n", *(m+j));
      ++j;
    }

 return 0;
}



GCC, Linux.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
ziv@mole:~/x/a$ emacs -nw a.cpp && g++ -o a a.cpp && ./a 1foo 2bar 3boo 4far 5buzz
argc = 6

./a
1foo
2bar
3boo
4far
5buzz


//2

jaunary 
february 
march 
april 
may 
june 
july 
august 
september 
october 
nobember 
december 
ziv@mole:~/x/a$ 



Как ты там умудрился выводить только по одному символу -- загадка.

Также два момента:
Пока учишся, пиши на ANSI C и C++. Не используй MS VC навороты. Типа stdafx, типа TCHAR.

const char* вместо char*.
...
Рейтинг: 0 / 0
26.02.2014, 15:55
    #38573108
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Win7, vs express 2013 for desktop. Выводит то что выводит, завтра буду еще думать
...
Рейтинг: 0 / 0
27.02.2014, 02:28
    #38573671
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
MasterZivПока учишся, пиши на ANSI C и C++. Не используй MS VC навороты. Типа stdafx, типа TCHAR.

имя главной функции (кстати, как правильно её называть, точка входа ? но фраза "переименовать точку входа не звучит, или ошибаюсь?") _tmain нужно поменять на main, и тогда всё ок. Вы правы
...
Рейтинг: 0 / 0
14.04.2014, 16:00
    #38614391
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
Неудобно с телефона. Но я все равно напишу. Опять об избыточности argc. Приведите пожалуйста пример когда без него никак. Когда мне не хватит нуля в конце argv.
...
Рейтинг: 0 / 0
14.04.2014, 17:54
    #38614572
For All
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
argc и argv
SashaMercuryНеудобно с телефона. Но я все равно напишу. Опять об избыточности argc. Приведите пожалуйста пример когда без него никак. Когда мне не хватит нуля в конце argv.

Уже ж ответили 15516618 . Ради обратной совместимости остался.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / argc и argv / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]