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

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

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

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


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

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


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

P.S. SashaMercury , мне кажется, проблемы у тебя с другим -- слишком много думаешь... Простая же вещь...
...
Рейтинг: 0 / 0
argc и argv
    #38548603
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
argc и argv
    #38548655
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokА в ТО время не было никакого си
В ТО время параметр argv не заканчивался NULL-ом. Это более поздняя защита от дураков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
argc и argv
    #38548684
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то мы про env забыли. А чё с ним. Опасен?

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



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


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

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

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

Конечно, правильно... Это почти шутка была...
...
Рейтинг: 0 / 0
argc и argv
    #38572444
Фотография 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.
#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
argc и argv
    #38572447
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я удивился что argc =4, я думал что 1 элемент имя программы, плюс три параметра запуска, плюс 1 на \0. Рассчитывал на пять элементов
...
Рейтинг: 0 / 0
argc и argv
    #38572485
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury плюс 1 на \0
это для защиты от выхода за пределы массива при подобном переборе. В argc этот пустой элемент не учитывается.
...
Рейтинг: 0 / 0
argc и argv
    #38572637
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больше похоже на два перевода строки как в http протоколе.
...
Рейтинг: 0 / 0
argc и argv
    #38572681
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
argc и argv
    #38573108
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Win7, vs express 2013 for desktop. Выводит то что выводит, завтра буду еще думать
...
Рейтинг: 0 / 0
argc и argv
    #38573671
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПока учишся, пиши на ANSI C и C++. Не используй MS VC навороты. Типа stdafx, типа TCHAR.

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

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


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