Форум программистов, компьютерный форум CyberForum.ru

Чем по умолчанию инициализируется символьный массив? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
18.06.2010, 18:15     Чем по умолчанию инициализируется символьный массив? #1
если '/0' конец массива, то что представляют собой остальные??
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2010, 18:15     Чем по умолчанию инициализируется символьный массив?
Посмотрите здесь:

C++ Не инициализируется массив
C++ Почему массив инициализируется с 7-ю элементами?..
Почему массив изначально нулями не инициализируется? C++
C++ Литерный, символьный массив
C++ 32-разрядный символьный массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
18.06.2010, 21:17     Чем по умолчанию инициализируется символьный массив? #2
http://codepad.org/Gr9T1eUo

p.s. '\0'
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
18.06.2010, 22:52  [ТС]     Чем по умолчанию инициализируется символьный массив? #3
ничо непонятно, что это за квадраты??
напремир если численный массив то по умолчанию там нули....
mrMRak
38 / 38 / 3
Регистрация: 02.06.2010
Сообщений: 105
18.06.2010, 23:30     Чем по умолчанию инициализируется символьный массив? #4
не всегда. там нули если вы инициализировали массив нулями. а так там всякая фигня. также и в чаре всякий бред.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.06.2010, 23:36     Чем по умолчанию инициализируется символьный массив? #5
Цитата Сообщение от Sanu0074 Посмотреть сообщение
если '/0' конец массива, то что представляют собой остальные??
там чтото, более того там и нуля может не быть
char s[20] = ""; - ноль будет первым элементом массива
char s[20]; - это скорее еще набор символов, чем строка
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
18.06.2010, 23:55  [ТС]     Чем по умолчанию инициализируется символьный массив? #6
ну а вот как мне быть если надо из многомерного символьного массива выбрать те слова которые состоят из трёх букв, например если массив mass[5][180], получается в массиве пять слов но эти слова длинной не 180, вот поэтому я задал такой вопрос)))
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.06.2010, 00:05     Чем по умолчанию инициализируется символьный массив? #7
во-первых выбрать из трех букв - это значит они уже инициализированы
если уж там чтото есть, то остальные элементы - это сами символы
time2die
51 / 51 / 3
Регистрация: 25.05.2010
Сообщений: 182
19.06.2010, 00:18     Чем по умолчанию инициализируется символьный массив? #8
Вопрос! Чем поумолчанию инициализируется символьный массив?
массив это некоторая абстрактная модель для работы с памятью, при инициализации оного ты получаешь доступ к куску памяти, который раньше использовала другая программа, и в этой памяти может быть ВСЁ что угодно, принято это ВСЁ считать мусором
получается в массиве пять слов
получается,что в массиве 5 наборов по 180 символов, которые могут составлять слова\предложения, осталось только их подсчитать
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
19.06.2010, 00:25  [ТС]     Чем по умолчанию инициализируется символьный массив? #9
всёравно чтото не вьеду, получается, например если слово из пяти букв а массив из 180элементов, то идут 5 символов а остальное мусор и в конце "\0", тогда как подсчитать колво этих букав?
mrMRak
38 / 38 / 3
Регистрация: 02.06.2010
Сообщений: 105
19.06.2010, 00:29     Чем по умолчанию инициализируется символьный массив? #10
никак. потому как мусор тоже будет считатся за слова. Массив должен быть заполнен определенными елементами при инициализации. Если адвекватный текст - то слова разделены пробелами,запятыми, точками иными знаками препинания. и вам надо найти - есть ли растояние между этими знаками в 3 елемента, если да, то это искомое слово.
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
19.06.2010, 00:41  [ТС]     Чем по умолчанию инициализируется символьный массив? #11
спс) те необойтись без пробелов и знаков препинания....
но всетаки наверно есть способ на проверку каждого элеиента массива на то - пренадлежит ли он например латинскому алфавиту и подсчитать колво этих символов в данной строке, тогда наверно и получим нужное......
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.06.2010, 00:51     Чем по умолчанию инициализируется символьный массив? #12
Цитата Сообщение от Sanu0074 Посмотреть сообщение
спс) те необойтись без пробелов и знаков препинания....
но всетаки наверно есть способ на проверку каждого элеиента массива на то - пренадлежит ли он например латинскому алфавиту и подсчитать колво этих символов в данной строке, тогда наверно и получим нужное......
такой лексикографический анализ больше похож на шаманство, так что лучше сразу все нормально делать
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
19.06.2010, 00:57  [ТС]     Чем по умолчанию инициализируется символьный массив? #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
такой лексикографический анализ больше похож на шаманство, так что лучше сразу все нормально делать
ну я думаю если при крайней необходимости, то можно использовать
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.06.2010, 05:46     Чем по умолчанию инициализируется символьный массив? #14
Цитата Сообщение от Sanu0074
если '/0' конец массива, то что представляют собой остальные??
C
1
char arr[100] = { '\0' };
все равны нулю

C
1
char arr[100];
все содержат случайные данные

для всех массивов и структур работает правило: если проинициализированы не все элементы, то все остальные инициализируются нулями

Добавлено через 5 минут
ещё внешние массивы есть, они вообще инициализируются нулями даже когда char arr[100];
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
19.06.2010, 06:03     Чем по умолчанию инициализируется символьный массив? #15
Sanu0074, если слово из 5 буква, а массив из 180 элементов...
все зависит от инициализации, вот в этом случае: char [180]="abcde"; сначала будут все пять букв по порядку, потом символ '\0', потом остальной мусор. потому что "abcde" - это строка "в ситиле Си", т.е. строка с нулем на конце.
'\0' - это якорь, он является терминалным (завершающим) символом любой последовательности символов которая трактуется, как строка текста. Нужно это для того, чтобы при выводе на экран строки можно было не заморачиваться о её длине и выводить все символы пока не встретися символ '\0'.
например:
C++
1
2
3
char p[100]="Hellow, world!";
int i=0;
while (p[i]!='\0') putc(p[i++]); //это аналогично cout << p;
кстати имя массива можно использовать в качестве ссылки на его первый элемент.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
19.06.2010, 11:55     Чем по умолчанию инициализируется символьный массив? #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Aye Aye, мусора на конце строки не будет

Если объяснять на пальцах, то в Си описание переменных можно сделать двумя способами:
  • "описание переменной;" (например "int x;" или "char a[10];") - переменная заводится но НЕ инициализируется. В этом случае глобальная переменная обнуляется, а локальная забивается мусором
  • "описание переменной = инициализатор;" (например "int x = 4;" или "char a[10] = { 'a', 'b' };"). В этом случае переменная инициализируется. Если переменная представляет собой массив или структуру, а инициализатор содержит меньше констант, чем требует того переменная, то вся оставшаяся часть переменной обнуляется

Таким образом при описании "char a[10] = { 'a', 'b' };" первые два элемента массива инициализируются значениями 'a' и 'b', а оставшиеся 8 элементов прописываются нулями. Языки Си/Си++ позволяют использовать строки (или более правильно название "строковые литералы") в качестве инициализаторов. В этом случае, например, строка "ab" трактуется как инициализатор из трёх элементов и эквивалентен { 'a', 'b', '\0' }.

Мы видим, что при инициализации массива char'ов строкой, инициализатор содержит на один элемент больше, чем если бы мы инициализировали через фигурные скобки. В следующих двух записях

C
1
2
char s[10] = { 'a', 'b' };
char s[10] = "ab";
по факту инициализация в обоих случаях будет одинакова, несмотря на то, что инициализаторы трактуются немного по разному. Но это происходит из-за того, что размер массива больше размера инициализатора и оставшиеся элементы прописываются нулями. Но вот две следующие инициализации НЕ эквивалентны

C
1
2
char s[] = { 'a', 'b' };
char s[] = "ab";
В первом случае массив s будет содержать два элемента, а во втором - три.

Краткий итог

1. При инициализации аггрегатной (составной) переменной неинициализированных хвост прописывается нулями
2. При инициализации массива char'ов строковой литерал трактуется как инициализатор из char'ов с нулём на конце. Т.е. две следующие записи строго эквивалентны

C
1
2
char s[10] = "ab";
char s[10] = { 'a', 'b', '\0' };
при этом с учётом пункта 1 обе записи трактуются как

C
1
char s[10] = { 'a', 'b', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' };
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2010, 13:54     Чем по умолчанию инициализируется символьный массив?
Еще ссылки по теме:

C++ Не инициализируется динамический одномерный массив
C++ Массив указателей на символьный массив
C++ Заполнить символьный массив в классе

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.06.2010, 13:54     Чем по умолчанию инициализируется символьный массив? #17
честно говоря сам не знал таких подробностей инициализации, особенно про глобальные переменные, хотя мне кажется лучше делать все явно
Yandex
Объявления
19.06.2010, 13:54     Чем по умолчанию инициализируется символьный массив?
Ответ Создать тему
Опции темы

Текущее время: 13:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru