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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.97
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
#1

Работа с массивом char - C++

08.07.2010, 21:54. Просмотров 4286. Ответов 32
Метки нет (Все метки)

Добрый день.
Объясните, если не сложно, на пальцах в чем ошибка?
C++
1
2
char*my1[]={"first my1","second my1"};
my1[0][0]='E';
Синтаксически все корректно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2010, 21:54     Работа с массивом char
Посмотрите здесь:

Работа с массивом char - C++
Вот задание Вам дана непустая строка, состоящая из строчных латинских букв, цифр и пробелов. Длина строки не превышает 250 символов....

Работа с массивом символов Char - C++
Народ помогите! 2. Дано целое число N и текстовый файл. Создать строковый файл, содержащий все слова длины N из исходного файла (знаки...

проблема с массивом типа CHAR - C++
нужно выполнить функцию fopen() . которая кушает на вход указатель на массив char в качестве пути к файлу ну и режим работы с файлом. ...

Задание с массивом типа char - C++
Нужно удалить все столбцы в которых есть хотя бы одна буква 'а'.Ошибка в delA,но не знаю как исправить #include <cstdlib> #include...

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

Проверка массива char на равенство с таким же массивом - C++
#include <iostream> using namespace std; int main() { char chArr={"4 8"}; char chCode={"4 8"}; if (chCode==chArr)...

Помощь с массивом char breed[4] = {'Dog ','Cat ', 'Rat ', 'Mouse '} - C++
У меня вот тут проблемка, и я просто хочу понять как оно работает... Я так более менее понимаю работу ссылки (*) и то, что по идее само имя...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
08.07.2010, 23:30     Работа с массивом char #16
Да, для того, чтобы все корректно работало нужно отдельно выделять память для указателей в массиве с помощью malloc() или оператора new в C++. После этого их можно будет изменять как в самом первом примере st_dent

Добавлено через 38 секунд
st_dent, именно так
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:50  [ТС]     Работа с массивом char #17
Demihalf,
Я правильно понял:
Ошибка в том, что я пытаюсь записать новое значение на место первого элемента массива, который находится в области памяти, доступной только для чтения?
-=ЮрА=-
Заблокирован
Автор FAQ
09.07.2010, 00:01     Работа с массивом char #18
Но єто всего лишь вывод, строка не меняется, привожу просто как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
void main()
{
    char *str[]={"first str","second str"};
    printf("Enter symbol for replacing :\t");
    char chr;scanf("%c",&chr);
    printf("%c%s\r\n",chr,str[0] + 1);
    printf("%s\r\n",str[1]);
}
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 00:07     Работа с массивом char #19
st_dent, да, точно. Чтобы так не происходило можно сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstring>
#include <iostream>
using namespace std;
 
int main() 
{
    const int size = 2;
    const int max_length = 256; // Вместо 256 можно любое число - это максимальная длина одной строки
    char* my1[size];
    for (int i = 0; i < size; i++)
        my1[i] = new char[max_length];
    strncpy(my1[0], "first my1", max_length - 1);
    strncpy(my1[1], "second my1", max_length - 1);
 
    my1[0][0] = 'E';
    cout << my1[0] << endl; //Eirst my1
 
    for (int i = 0; i < size; i++)
        delete my1[i];
    return 0;
}
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.07.2010, 00:10     Работа с массивом char #20
ах во оно как, до меня дошло.
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 00:35     Работа с массивом char #21
Всегда рад помочь
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.07.2010, 01:00     Работа с массивом char #22
Вместо выделения памяти и прочего, не легче сделать:
C++
1
2
3
4
5
6
7
8
9
const size_t size       = 2;
const size_t max_length = 256;
 
char arr[size][max_length] = {
  { "first string" },
  { "second string" },
};
 
arr[0][0] = 'E';
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
09.07.2010, 01:22  [ТС]     Работа с массивом char #23
CyBOSSeR, хотелось понять в чем ошибка в конкретном примере, а не получить готовое решение.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.07.2010, 03:54     Работа с массивом char #24
C
1
2
    printf("%c" "\n", "abcde"[2]);
    printf("%s" "\n", &"abcde"[2]);
насчёт обращения там всё правильно
в строковой константе ничего нельзя изменить до конца программы
две одинаковые строковые константы в разных местах программы, могут ссылаться на одну строку в памяти
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 09:29     Работа с массивом char #25
st_dent, Массив my1 у вас является одномерным так как в обьявлении только одна пара скобок [], если хотите обьявить массив двумерный то надо ставить две пары скобок my1[][].
По поводу обращения, то получается что первый оператор индексирования []вытаскивает из массива my1 строку, а второй уже применяется к строке что бы вытащить символ

Добавлено через 11 минут
Demihalf, обьясните почему происходит ACCESS VIOLATION

Добавлено через 11 минут
как я понимаю это из за того что там строковые константы а если выделять память динамически то они таковыми являтся не будут так?
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 09:31     Работа с массивом char #26
[Freeman],указатель на указатель тоже вполне можно рассматривать, как двумерный массив. А массив как указатель. Я уже об этом писал. И обычно нормальные авторы пособий по Си/Си++ об этом говорят. (Пример: Джесс Либерти, Брэдли Джонс "Освой самостоятельно C++ за 21 день", пятое издание, страница 372 и вообще вся 13 глава)

И в том же сообщении я оставил ссылку на Википедию про ошибку сегментации (Access violation). Проблема та же, что в этом примере:
C
1
2
char *s = "hello world";
*s = 'H';
То есть указатель s указывает на область памяти с первым символом строки. Это ясно. Но строки в Си при присваивании таким образом создаются в памяти только для чтения. При попытке изменить константную для операционной системы строку, возникает ошибка доступа. Чтобы этого не было нужно использовать strcpy или strncpy

Вот еще раз ссылка, там написано подробнее:
http://ru.wikipedia.org/wiki/%D0%9E%...86%D0%B8%D0%B8
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.07.2010, 09:52     Работа с массивом char #27
Цитата Сообщение от st_dent Посмотреть сообщение
хотелось понять в чем ошибка в конкретном примере, а не получить готовое решение.
В твоем примере массив my1 содержит два указателя на строковые литералы, которые были помещены в область памяти только для чтения. Как правильно сказал accept:
Цитата Сообщение от accept Посмотреть сообщение
две одинаковые строковые константы в разных местах программы, могут ссылаться на одну строку в памяти
Отсюда и исключение, выбрасываемое при попытке записи в память только для чтения в строке:
Цитата Сообщение от st_dent Посмотреть сообщение
my1[0][0]='E';
В примере, приведеном мною в посте #22 массив arr содержит два массива символов, которые в отличии от строковых литералов, помещаются в память доступную для записи, что позволяет осуществлять изменение их содержания.
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 14:42     Работа с массивом char #28
Demihalf, в e-библиотеке эта книга у меня есть прочитал...
последний вопрос то есть когда используется strcpy а не оператор присвоения, то строки не будут только для чтения(константными) тогда для чего еще выделять память динамически?
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 15:28     Работа с массивом char #29
[Freeman], когда используется strcpy, она копирует все символы из source по необходимому адресу (destination). Если мы поступим так:
C
1
2
char* s;
strcpy(s, "Hello, world");
возникнет тот же пресловутый Access violation, так как указатель не инициализирован, он не указывает ни на какую область памяти. То есть, выделяя память под строку, мы получаем указатель на область памяти, которую можем менять:
C
1
2
s = (char*)malloc(sizeof(char) * 256);
strcpy(s, "Hello, world");
На C++:
C++
1
2
char* s = new char[256];
strcpy(s, "Hello, world");
Можно сделать по-другому:
C
1
2
char s[256];
strcpy(s, "Hello, world");
Здесь происходит что-то подобное, только вместо Кучи, строка хранится в стеке.

И вообще, присваивать строковой литерал указателю напрямую нельзя, кроме случая инициализации константы:
C
1
const char* = "Hello, world";
Нужно использовать strcpy или, что желательнее, strncpy, которая позволяет контролировать количество копируемых символов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2010, 16:27     Работа с массивом char
Еще ссылки по теме:

Объяснить разницу между массивом типа char и строкой в стиле Си (нюансы использования нуль-терминатора) - C++
Господа, появился такой вопрос: какое место занимает \0 в массиве charов? В данном коде пытался выйти из цикла по достижении...

работа с массивом указателей - C++
#include &lt;iostream&gt; using namespace std; int main() { const int size=3; char *student={};

работа с массивом указателей - C++
как имея изначально: char *student={}; получить: char...

Работа с массивом в файле - C++
Нужно написать программу которая выводила массив из файла на экран, после этого его можно было бы записать заново и потом сохранить в этот...

Работа с файлами и массивом - C++
Помогите как занести в массив map&lt;string,string&gt;baza; сначало с 1 файла в 1 &lt;string&gt;названия машин потом со 2 файла 2 &lt;string&gt; значения что...


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

Или воспользуйтесь поиском по форуму:
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 16:27     Работа с массивом char #30
Все я понял, я по началу хотел спросить а что если инициализировать указатель 0, но если подумать то это просто будет нулевой указатель который не указывает на область памяти в которую можно что то записать по этому нужно выделять память динамически или в стеке путем обьявления массива
Примеры мог не приводить уж как выделять память знаю
Yandex
Объявления
09.07.2010, 16:27     Работа с массивом char
Ответ Создать тему
Опции темы

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