Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Князь Трех Море
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21
1

В С++ может ли argv быть двухмерным массивом?

09.05.2013, 17:23. Просмотров 1485. Ответов 40
Метки нет (Все метки)

C++
1
2
3
int main(int argc, char *argv[]) {
    argv[1][0] = tolower(argv[1][0]);
    argv[1][1] = tolower(argv[1][1]);
Вот что это означает?
Когда у argv с двумя аргументами?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 17:23
Ответы с готовыми решениями:

Задача с двухмерным динамическим массивом
Пользователь вводит количество строк двумерного динамического массива....

Управление двухмерным массивом из функции
Доброго времени суток, пожалуйста, подскажите, как правильно передать в функцию...

Работа с двухмерным динамеческим массивом через указатель
Натупил здесь наверное сильно, подскажите ребят, а то долго уже сиджу над...

Что есть argc и **argv в функции int main(int argc, char **argv)?
Здраствуйте, уважаемые кодеры! Что означает argc и **argv в функции int...

Может ли быть такое?
поставил счетчик для сравнений в пирамидальной сортировке массива выдает 34732...

40
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.05.2013, 17:45 2
ображение к символу
0
Князь Трех Море
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 21
09.05.2013, 18:00  [ТС] 3
Jupiter, но почему там два значения, а не одно?
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.05.2013, 18:04 4
argv[1] - обращаемся к первому аргументу командной строки <-- это строка
argv[1][0] - обращаемся к первому символу первого аргумента командной строки <-- это символ - char
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,337
Записей в блоге: 5
09.05.2013, 18:53 5
Князь Трех Море, дело не в аргументе функции Main, а в типе char *. Этот тип унаследован от C и здорово отличается от других примитивных типов языка. Это указатель на массив "знающий" свой размер, за что его иногда называют, как-то вроде, "почти контейнер". Определить размер можно по завершающему нуль-символу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main(){
char *a/* <- это уже массив символов с завершающим '\0' (C-строка) */=
"Mama mila ramu";//завершающий 0 в самом литерале не присутствует, но добавится автоматически при инициализации
//указывая, что данная строка - единое целое, как значение на которое указывает a
cout<<a<<endl;
char *b /* скобки [] показывают что это массив C-строк указанных слева -> */ []=
{"Hare","Rama","Hare","Crishna"};//при инициализации завершающие нули появятся у каждой C-строки на которую
//будут указывать b[0]...b[3]
for(int i=0; i<4; ++i)cout<<b[i]<<" ";
cout<<endl;
system("pause");
return 0;   
}
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
13.05.2013, 19:58 6
Цитата Сообщение от IGPIGP Посмотреть сообщение
Этот тип унаследован от C и здорово отличается от других примитивных типов языка. Это указатель на массив "знающий" свой размер, за что его иногда называют, как-то вроде, "почти контейнер". Определить размер можно по завершающему нуль-символу
Ну это вы, конечно, через край хватанули)) Ничего в этом типе особенного нет, просто среди элементов, которые может содержать такой массив, выделяется один, который является неким зарезервированным ограничителем. Точно так же в массиве натуральных чисел (целых положительных, больших нуля) ограничителем может быть нулевой элемент. В массиве даблов таким элементом может быть какой-нибудь INF или NAN. Кстати, функция strtok отлично демонстрирует, что ничего особенного в нуль-терминаторе нет, она использует его как свой служебный символ, служащий разделителем токенов.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,337
Записей в блоге: 5
13.05.2013, 20:20 7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ну это вы, конечно, через край хватанули))
Не уверен. Хватанул конечно, - со мной бывает. Но думаю не сейчас. Указатель на char как и любой указатель не является законченным типом, пока не инициализирован. Но даже и в этом он отличается от других указателей. Его нуль-символ поддерживается почти, всеми библиотечными функциями, принимающими тип char. Другими словами, этот указатель имеет для них иной смысл. А это значит, что и будучи инициализированным он представляет качественно, иной тип. Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история. Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 20:29 8
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
но это не заслуга char*,а заслуга функций, в которых сделали такое поведение для данного типа.
Таким же образом можно не добавлять ноль в конец. А можно написать аналоги для int*,но это же не сделает int* супер-типом
1
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
13.05.2013, 20:30 9
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель на char как и любой указатель не является законченным типом, пока не инициализирован
Почему это вдруг? Указатель - вполне себе законченный тип. Пока переменная-указатель не инициализирована, она просто содержит мусор, как и любая другая переменная языка С/С++.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Другими словами, этот указатель имеет для них иной смысл.
В этом и ошибка - не указатель имеет для них особый смысл, а нуль-терминатор.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Распечатав указатель на int мы увидим стандартный поток вывода выдаст на консоль что-то вроде E2E4 (шах!)), то есть значение 4-байтового адреса. С указателем на char, - другая история.
Речь, полагаю, о стандартном выводе в С++? std::cout?
Цитата Сообщение от IGPIGP Посмотреть сообщение
С указателем на char, - другая история.
Никакой другой истории, обычная перегрузка.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но тип, в числе прочего определяется допустимыми операциями и это значит, что раз указатель на char интерпретируется иначе чем другие, то и тип это другой?
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
0
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 20:40 10
Немного проясню для тех, кто похоже чего-то не понимает
Нуль-терминатор это всего лишь условность. Разработчики языка С решили, что строки будут заканчиваться на 0, с таким же успехом они могли решить использовать для этого любой другой символ. В ассемблере (точнее в DOS), например, в качестве этого символа используется '$'.
Т.е. на С мы имеем
C++
1
"Hello, World!", 0;
а на ассемблере под DOS
Assembler
1
"Hello, World!", '$'
Никакого скрытого магического смысла завершающий символ не несет, и уж тем более не меняет свойства указателя, указывающего на строку его (завершающий символ) содержащую.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,337
Записей в блоге: 5
13.05.2013, 20:58 11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Интерпретация и допустимые операции - совсем разные вещи. Для указателя на char допустимые операции точно такие же, как для любого другого указателя.
Хорошо, пусть библиотеки, - не встроенные в язык средства. Но какой ещё указатель можно инициализировать, полагаясь на автоматическое завершение каким-то специальным образом:
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
Что касается таких библиотек как, стандартный поток вывода, то это тоже совсем не мало.
Указатель на char можно использовать и как указатель на символ, но можно и как указатель на С-строку. У компилятора нет средств определить, что имеется в виду не попробовав. Но в вопросе темы, - вопрос о 2-мерном массиве и важно было объяснить, что массив указателей на char, в данном случае массив массивов, то есть 2-х мерный. От таких же массивов других примитивных типов (int[] например), его размерность в строках может не совпадать, что является признаком схожим с контейнерами.
Я не стану спорить с тем, что указатель на char имеет много общего с указателями на другие типы, но отличия от них у него, достаточно существенны.

Добавлено через 3 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
Никакого скрытого магического смысла завершающий символ не несет, и уж тем более не меняет свойства указателя, указывающего на строку его (завершающий символ) содержащую.
Да хоть, чем бы ни завершался. Скрытым он является при интерпретации и инициализации. А желание понять, оно или есть или его нет. Обращайтесь в первом лице, в обморок не упаду.
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:00 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
Эта возможность называется операцией инициализации и встроена в язык
Угу. Указатель инициализируется указателем - все стандартно, как и для всех типов

И виноват в этом не указатель на char, а то что создается строковый литерал(или используется уже созданный) и его адресом инициализируется указатель.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
13.05.2013, 21:03 13
Цитата Сообщение от IGPIGP Посмотреть сообщение
char* a = "abcde";
Это несколько иное. Тут в язык встроена возможность создания компилятором строкового литерала, который интерпретируется как константный указатель на char (кстати, побуду занудой, и скажу, что данный код не соответствует стандарту - указатель на коснтанту присваивается указателю на не-константу ). А сам char * здесь просто выступает котейнером, хранителем адреса константного литерала. Так что, опять же, в самом указателе нет ничего сверхъестественного.
1
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:03 14
Цитата Сообщение от IGPIGP Посмотреть сообщение
char* a = "abcde";
Эта возможность называется операцией инициализации и встроена в язык.
суть в том, что когда компилятор видит что-то в двойных ковычках, он дописывает 0 в конце, а не в том, что инициализируется char*.

update: блин страницу не обновил)
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,337
Записей в блоге: 5
13.05.2013, 21:07 15
Цитата Сообщение от Croessmah Посмотреть сообщение
Указатель инициализируется указателем - все стандартно, как и для всех типов
Указатель получает значение указателя, а инициализируется память. И память тут инициализируется скрывая присоединение символа завершения.

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
суть в том, что когда компилятор видит что-то в двойных ковычках
Собственно, всё можно свести к поведению компилятора.
0
Kastaneda
Jesus loves me
Эксперт С++
4938 / 3014 / 346
Регистрация: 12.12.2009
Сообщений: 7,610
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:08 16
Цитата Сообщение от IGPIGP Посмотреть сообщение
Указатель получает значение указателя, а инициализируется память.
C++
1
const char *str = "asdf";
указатель str инициализируется "указателем" "asdf", потому что "asfd" после компиляции станет указателем. Вот это
C++
1
char ch = "asdf"[0];
вполне валидная операция, по причине, описанной выше.

Называть "asfd" указателем конечно неправильно, поэтому этот термин употреблен в кавычках.
1
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:09 17
Цитата Сообщение от IGPIGP Посмотреть сообщение
И память тут инициализируется скрывая присоединение символа завершения.
тогда еще и "равно" скрывает это:
C++
1
char * super_pointer("my string");
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7053 / 3356 / 454
Регистрация: 04.12.2011
Сообщений: 9,337
Записей в блоге: 5
13.05.2013, 21:19 18
Цитата Сообщение от silent_1991 Посмотреть сообщение
Тут в язык встроена возможность создания компилятором строкового литерала, который интерпретируется как константный указатель на char
Ключевая фраза, - "в язык встроена возможность" - признак типа. Побуду занудой и констатирую, что для
const *char я Вас убедил. Но не констант, что другой тип? Мой компилятор позволяет инициализировать:
char* a ="abcd";
и потом:
a[0]='w';
то есть, такое ощущение, что это аналогично созданию массива:
char a[] = {'a', 'b', 'c', 'd', '\0'};


Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
тогда еще и "равно" скрывает это:
нет, именно инициализация. Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
13.05.2013, 21:31 19
IGPIGP, ну так "abcd" - это же и есть массив - char const [5].
1
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
13.05.2013, 21:42 20
Цитата Сообщение от IGPIGP Посмотреть сообщение
то есть, такое ощущение, что это аналогично созданию массива:
То что Вы делаете, это UB - вы пишите в строковый литерал
Переменную типа int тоже можно рассмотреть как массив из sizeof(int) элементов типа char. И адрес этой int переменной будет адресом начала массива
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваш пример инициализации "равно", кстати не содержит, зачем же о нём говорить?
Затем, что значение указателя инициализируется указателем
0
13.05.2013, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 21:42

где может быть ошибка на с++
при подсчете sn через 5 членов цикл повторяется вот текст программы ...

Где может быть ошибка?
#include &lt;iostream&gt; #include &lt;queue&gt; #include &lt;string&gt; using namespace std;...

Как такое может быть?
Пишу программку... Начало функции мейн. Не прошло еще ничего кроме файла: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru