Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2010, 12:30   #1
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию как элементы массива argv могли бы указывать записи командной строки?

Здравствуйте.Возник вопросик - про "как элементы массива argv могли бы указывать записи командной строки."
Код:
main (int argc, char* argv[])
Например есть 3 командных аргумента "Привет Файл кот"

Argv[0] = П р и в е т NULL [7]
Argv[1] = Ф а й л NULL [5]
Argv[2] = К о т NULL [4]

Под каждый аргумент должно выделяться одинаковое кол-во памяти,т.е. получается что при файле NULL будет занимать 3 и при коте 4 ???

И второй вопрос:
Специфика си компилятора позволяет без ошибки компилировать это место
Код:
main (int argc, char* argv[]){ 
...
for (i=0;i<argc;i++)
If (argv[i][0] = ....)
...
}
Но как так получается,что из одномерного массива получается двухмерный? Как это объясняется относительно выделения памяти и указания записи командной строки?
Serjuk вне форума Ответить с цитированием
Старый 21.01.2010, 13:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Под каждый аргумент должно выделяться одинаковое кол-во памяти
Кто это тебе такое сказал?
И вообще. Для определения длины аргумента применяй strlen() как и с обычными сишными строками
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.01.2010, 13:27   #3
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Код:
char* argv[]
- массив указателей на char. Т.е. в этом массиве записаны адреса первых элементов строк. Область памяти, начинающаяся с этого адреса, и заканчивающаяся символом \0 (а не NULL, кстати), считается одной строкой.
Отсюда вытекает ответ и на второй вопрос. argv[i] - указывает на начальную ячейку, а второй индекс - смещение относительно неё
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 21.01.2010, 18:00   #4
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Кто это тебе такое сказал?
И вообще. Для определения длины аргумента применяй strlen() как и с обычными сишными строками
Преподаватель)

Цитата:
Код:

char* argv[]

- массив указателей на char. Т.е. в этом массиве записаны адреса первых элементов строк. Область памяти, начинающаяся с этого адреса, и заканчивающаяся символом \0 (а не NULL, кстати), считается одной строкой.
Отсюда вытекает ответ и на второй вопрос. argv[i] - указывает на начальную ячейку, а второй индекс - смещение относительно неё
Т.е. в случае "Привет" в argv[i] содержится буква П? а в во втором "р"?

И кстати судя по этой картинке - память для всех аргументов одинаковая..
Изображения
Тип файла: gif p36.gif (9.2 Кб, 53 просмотров)
Serjuk вне форума Ответить с цитированием
Старый 21.01.2010, 18:09   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Serjuk Посмотреть сообщение
И кстати судя по этой картинке - память для всех аргументов одинаковая..
вероятнее всего это лишь иллюстрация... параметры командной строки не обязаны быть одинаковой длины
Цитата:

Т.е. в случае "Привет" в argv[i] содержится буква П? а в во втором "р"?
Нет, в argv[1] содержится адрес ячейки, в которой находится буква П. если к этому адресу добавить 1, то там будет буква р, 2 - и и т.д.
netrino вне форума Ответить с цитированием
Старый 21.01.2010, 18:12   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И кстати судя по этой картинке - память для всех аргументов одинаковая.
вообще то как раз наоборот.а то адреса кратны...так это выравнивание и не более.

вообще можно сказать что там записано так char** (а не char* argv[])
тогда беря первый индекс мы берем указатель(char*)
а через него можем получить доступ к каждому символу аргумента
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 21.01.2010 в 18:14.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.01.2010, 10:03   #7
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Так с этим ясно)

Ну почему мы все таки имеем право использовать двухмерный массив,если задали одномерный???
Serjuk вне форума Ответить с цитированием
Старый 22.01.2010, 10:50   #8
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Код:
char *argv[]
[] - одно измерение, * - второе, массив двумерный
Строка - это тоже массив, а в argv хранится массив указателей на строки
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
1.Найти в матрице первую строку, все элементы которой отрицательны 2.отсортировать элементы массива по в w0lf16 Помощь студентам 2 22.11.2009 15:47
Параметры из командной строки ProGg Паскаль, Turbo Pascal, PascalABC.NET 5 13.02.2009 00:17
Си. Как суммировать элементы массива? dma Помощь студентам 2 06.12.2008 17:11
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44
Как удалять элементы массива в Паскале? Антонова Анна Помощь студентам 2 08.12.2007 17:01