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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
ligorlwow
0 / 0 / 0
Регистрация: 05.01.2012
Сообщений: 19
#1

Семантика массивов char. - C++

14.03.2012, 13:14. Просмотров 1530. Ответов 21
Метки нет (Все метки)

Добрый день. Мы все знаем, что в C и С++ создав два массива подрят.. запросив элемент привышающий размерность первого мы зайдем во второй. Так вот столкнулся со след проблемой в массивах типа char.
Написав следующее :
C++
1
2
3
4
char a[2];
a[0]='2';
a[1]='4';
cout<<a; // я получил 24 , что и мною ожидалось.
Написав следующее :
C++
1
2
3
4
5
char a[2];
int b=(int)'0';
a[0]='2';
a[1]='4';
cout<<a; // я получаю 240, что я лично не ожидал..
За место int b=(int)'0'; можно инициализовать любую переменную и мы получим мусор, я взял '0' для наглядности проблемы.. В последующим изменение переменной char a[2] она ведет себя как состоящая из 3 элементов. Плз, прошу помочь разобратся в сути проблемы. Только не пишити "Используй strcat и т.д...." мне надо.. понять, почему cout выводит массив из 3 , а не из 2 элементов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2012, 13:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Семантика массивов char. (C++):

Сравнение 2-ух char массивов - C++
Помогите. Имеется 2 char массива. Один содержит слово вводимое пользователем, а второй это же слово, только наоборот. Необходимо сравнить...

обработка массивов char - C++
Здравствуйте, помогите решить проблему. Мне необходимо сделать массив char, корорый в каждой своей ячейке будет сожде ржать два члена...

Переменная char и названия массивов - C++
Простите, если глупый вопрос, у меня есть десять массивов и функция поиска элемента в массиве. Чтобы десять раз не вызывать ее для...

Сравнение массивов типа Char - C++
У меня есть структура. Мне нужно проверит, (sportsmens.Sport==&quot;swimming&quot;); sportsmens.Sport - массив типа char

Сравнение двух символьных массивов - char C++ - C++
Доброго времени суток! Столкнулся с проблемой кода программы. Мне нужно сравнить текст из файла (primer.txt), и сравнить его с текстом,...

Сортировка элементов массивов указателей на char - C++
Ни как не получается отсортировать это. Помогите отладить прогу плиз int main() { _getch(); char *arrptrs = {&quot;g&quot;,&quot;e&quot;, ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
15.03.2012, 18:17 #16
Van111
Да, у меня также выводится. Может от компилятора зависит, но у меня на gcc так.

И даже если попробовать как в изначальном примере. Если добавить ещё одну переменную, допустим:

C++
1
2
3
char b = 'x'; 
char a[5];
memcpy(a,"hello",5);
То выведется hellox, как будто бы дальше есть нулевой символ. Но откуда бы ему там взяться...если там должен быть всякий мусор.

Добавлено через 14 минут
Вот ещё простой пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    char a[3];
    
    a[0] = 'h';
    a[1] = 'e';
    a[2] = 'y';
    
    std::cout << "a = " << a << "\n";
    
    std::cout << "characters = ";
    for(int i = 0; i < 10; ++i)
        std::cout << a[i];
        
    return 0;
}
результат
a = hey
characters = hey♥ Р¤


Каким образом cout догадывается, когда ему закончить ввод? За последним элементом массива как видно, мусор. Почему он не выводится в этом случае? Разве cout "знает" о размере массива? Вот объясните мне кто-нибудь, я честно не понимаю.
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
15.03.2012, 21:06 #17
Цитата Сообщение от Abendstern Посмотреть сообщение
Каким образом cout догадывается, когда ему закончить ввод?
Может в gcc уже некоторые фичи из c++11 реализованы? Например "массив знает свой размер".

Потому что у меня всегда выводит мусор до первого \0 (Visual Studio 10 Express).
Запускал несколько раз подряд твой простой пример, почему-то в 30-50% случаев нулевой символ сразу после массива :]
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
16.03.2012, 17:39 #18
Цитата Сообщение от Abendstern Посмотреть сообщение
Каким образом cout догадывается, когда ему закончить ввод? За последним элементом массива как видно, мусор. Почему он не выводится в этом случае? Разве cout "знает" о размере массива? Вот объясните мне кто-нибудь, я честно не понимаю.
если запустить под шеснадцетиричным редакторомто, то по умлчанию сегмент данных обычно заполняется нулями . Из этого следует что если мы там разместили один массив букв то у нас с выводом будет всё ок если компилятор своей инфы туда не добавит

Добавлено через 3 минуты
Цитата Сообщение от Cool-T Посмотреть сообщение
Может в gcc уже некоторые фичи из c++11 реализованы? Например "массив знает свой размер".
нет не знает. для ограничения массива используют либо второй параметр либо в конце ставят условный символ\набор символов которые служат сигналом о окончании массива. первый способ жрёт на 4 байта больше памяти за то гораздо быстрей обрабатывается(то есть там отключена проверка элемента массива на на окончание, ведь размер передается аргументом функции)
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
16.03.2012, 23:55 #19
Цитата Сообщение от Van111 Посмотреть сообщение
(то есть там отключена проверка элемента массива на на окончание, ведь размер передается аргументом функции)
Почему же? Ведь переменная счетчик точно так же сравнивается с размером на каждой итерации.
ligorlwow
0 / 0 / 0
Регистрация: 05.01.2012
Сообщений: 19
17.03.2012, 10:54  [ТС] #20
Цитата Сообщение от Van111 Посмотреть сообщение
для ограничения массива используют либо второй параметр либо в конце ставят условный символ\набор символов которые служат сигналом о окончании массива
Но проблема заключалась именно в том, что указывая размерность массива.. я получаю некорректный вывод... Мне не жалко 4 байтов для указания размера массива, но даже указав размер, я не получаю должно результата.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
17.03.2012, 14:39 #21
Цитата Сообщение от ligorlwow Посмотреть сообщение
Но проблема заключалась именно в том, что указывая размерность массива.. я получаю некорректный вывод... Мне не жалко 4 байтов для указания размера массива, но даже указав размер, я не получаю должно результата.
если массив двухмерный то нужно два размера передавать и т п

Добавлено через 2 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Почему же? Ведь переменная счетчик точно так же сравнивается с размером на каждой итерации.
я имел в виду то что когда размер массива известен нам не надо проверять каждый символ на то евляется ли он сигналом о конце массива или нет
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
18.03.2012, 13:28 #22
Цитата Сообщение от Van111 Посмотреть сообщение
каждый символ на то евляется ли он сигналом о конце массива или нет
Правильно, вместо этого мы проверяем не является ли этот элемент массива последним, сравнивая счетчик с переданным размером.
Поверка с переданным размером.
C++
1
for ( int i = 0; i < size; i++ ) ...
Проверка с помощью ограничивающего символа.
C++
1
for ( int i = 0; a[ i ] != '\0'; i++ ) ...
Как видно, проверка нужна в любом случае.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 13:28
Привет! Вот еще темы с ответами:

Перемножение столбиком двух массивов char - C++
Здравствуйте. Задание таково: используя символьный массив char, который отображает два положительных целых числа - создать третий...

Передача в функции массивов типа char - ошибка - C++
Мне нужно передать в функцию 2 массива типа char (не string)и сделать в функции некоторую их обработку. Функция типа void. Но почему-то...

Вивести саме довге слово из 3 массивов char - C++
Вивести саме довге слово из 3 массивов char char name,surname,patronymic; Добавлено через 11 минут нужна только проверка!!!!

Сложение двух динамических массивов char* в одну строку - C++
В массивы вводятся данные, масcивы вида : int n,k; char *a,*b; a=new char; b=new char; Как вывести результирующую...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.03.2012, 13:28
Ответ Создать тему
Опции темы

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