С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

14.03.2012, 13:14. Просмотров 1569. Ответов 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 элементов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;, ...

21
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
14.03.2012, 15:39 #2
Цитата Сообщение от ligorlwow Посмотреть сообщение
"Используй strcat и т.д...." мне надо.. понять, почему cout выводит массив из 3 , а не из 2 элементов.
cout не рассчитан на вывод массива !!!!

Добавлено через 53 секунды
Цитата Сообщение от ligorlwow Посмотреть сообщение
char a[2];
a[0]='2';
a[1]='4';
cout<<a; // я получил 24 , что и мною ожидалось.
вывилось число размером в четыре байта(третий и четвёртый оказались наверно нулями )
напиши cout <<(char)a[0];

Добавлено через 5 минут
Цитата Сообщение от ligorlwow Посмотреть сообщение
почему cout выводит массив из 3 , а не из 2 элементов
потому что a это указатель состоящий из четырёх байт (на xp, процессор intel)

Добавлено через 4 минуты
вот дамп памяти
dd a 0x..... //адресс
db 2 //a[0]
db 4//a[1]
dd 0//int b возможно вот так расположились элементы
cout получает адресс и выводит число по этому адрессу ,а за размер вывода берёт размер аргумента который получил

Добавлено через 1 минуту
у меня они располагаются чуть по другому и в результате выводится
24# (четыре символа)
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
14.03.2012, 15:40 #3
Имя массива без индекса это константный указатель на первый элемент, при написании cout << a; вы выводите содержимое указателя, то есть адрес на первый элемент, а не массив.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
14.03.2012, 15:41 #4
Цитата Сообщение от ligorlwow Посмотреть сообщение
Мы все знаем, что в C и С++ создав два массива подрят.. запросив элемент привышающий размерность первого мы зайдем во второй.
Мы все знаем, что это неверно. Расположение различных переменных (а два массива - это две разных переменных) в памяти не специфицируется. Достоверно можно утверждать только одно: запросив элемент, превышающий размерность первого массива, мы попадем "куда-то".... а вот что "там" окажется - это уж зависит от фазы Луны....
1
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
14.03.2012, 15:42 #5
Цитата Сообщение от Toshkarik Посмотреть сообщение
Имя массива без индекса это константный указатель на первый элемент, при написании cout << a; вы выводите содержимое указателя, то есть адрес на первый элемент, а не массив.
а как объяснить результат этого вывода?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <stdlib.h>
using namespace std;
 
 
int main()
{
int x[10];
char a[2];
a[0]='2';
a[1]='4';
int b=48;
cout<<a;  
 
 system("pause");
 return 0;   
}
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
14.03.2012, 16:02 #6
Van111, возможно что это зависит от компилятора, я пока еще не такой гуру Знаю не все, но могу предположить, что так как char a[] это строка, возможно cout перегружен на вывод строк, но в ней нет ноль-символа. Поэтому затрудняюсь.
0
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
14.03.2012, 16:16 #7
Вопрос про Swich
тоже забавка
0
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
14.03.2012, 16:26 #8
Вообще cout умеет выводить строки завешённые нуль-символом, разве не так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int main()
{
    char a[3];
    a[0] = '2';
    a[1] = '4';
    a[2] = '\0';
    
    int b=(int)'0';
    
    std::cout << a << '\n';
 
    return 0;
}
0
ligorlwow
0 / 0 / 0
Регистрация: 05.01.2012
Сообщений: 19
14.03.2012, 19:45  [ТС] #9
Всем спасибо за ответы.. Насчет 4 байтов.. у меня не так(( Просто та же самая sizeof(a) в обоих случаях выводит 2. String да.. занимает 4 байта. Насчет того, что а - указатель на первый элемент, но вродь cout умеет выводить именно массив(чаровский). Система : Win 7 64 , проц Phenom 955.
0
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
14.03.2012, 19:51 #10
Цитата Сообщение от ligorlwow Посмотреть сообщение
Насчет того, что а - указатель на первый элемент, но вродь cout умеет выводить именно массив(чаровский).
Так он и выводит, пока не встретит 0x00

Например код
C++
1
2
3
4
5
char a[2];
    int b=(int)'0';
    a[0]='2';
    a[1]='4';
    cout<<a;
Выводит у меня
24╠╠╠╠╠╠`°8 в общем всю кашу ^^
0
ligorlwow
0 / 0 / 0
Регистрация: 05.01.2012
Сообщений: 19
14.03.2012, 20:14  [ТС] #11
Ну тогда логичо, что компиль должен сам этим заниматся или нет?(всмысле вставлять 0x30) Просто тогда какой смысл указывать размерность..? Указав сейчас char a[0]; и последний элемент a[2]='\0';
То я получил 24....
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
14.03.2012, 20:52 #12
Если строка объявляется так
C++
1
char a[] = "hello";
то символ '\0' вставится автоматически и размер будет не 5 по количеству букв а 6. Если же написать вот так
C++
1
char a[ 5 ] = "hello";
то естественно не будет ограничивающего символа. И проверка уже ложится на программиста.
0
ligorlwow
0 / 0 / 0
Регистрация: 05.01.2012
Сообщений: 19
14.03.2012, 21:01  [ТС] #13
Спсибо за ответ...) Придется самому задавать..)) Все тему можно закрывать..)
0
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
15.03.2012, 11:23 #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если же написать вот так
C++
1
char a[ 5 ] = "hello";
то естественно не будет ограничивающего символа. И проверка уже ложится на программиста.
Тем более, что это это приведёт к ошибке компиляции
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
15.03.2012, 17:44 #15
Цитата Сообщение от Abendstern Посмотреть сообщение
Тем более, что это это приведёт к ошибке компиляции
если хотим без нулего символа то это делается так
C++
1
2
char a[5];
memcpy(a,"hello",5);
Добавлено через 2 минуты
отладчиком проверял - ноль не добавляется но слово почему то cout`ом выводится нормально
0
15.03.2012, 17:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2012, 17:44
Привет! Вот еще темы с ответами:

Перемножение столбиком двух массивов 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; Как вывести результирующую...


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

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

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