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

Ячейка заполненной строки не перезаписывается - C++

Восстановить пароль Регистрация
 
Jeironica
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 16
27.02.2013, 14:48     Ячейка заполненной строки не перезаписывается #1
Есть массив со строкой. Одну из его ячеек необходимо перезаписать, но этого не получается. Используемое ПО - Visual Studio 2008 (версию по-новее просто не потянет комп ( ).

Код (я его предельно упростила):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <stdio.h>
using namespace std;
 
void main()
{
    char *ar=new char[12];
    ar="0123456789";
 
char x;
x=='*';
ar[4]=x;
}
Заранее спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 14:48     Ячейка заполненной строки не перезаписывается
Посмотрите здесь:

C++ Матрицы. Поиск области, заполненной единицами. C++
C++ Определить длину строки,удалить из строки все символы, которые равны заданному
Среди столбцов заданной целочисленной матрицы, заполненной случайными числами, порядка n* n, найти столбец с элементами C++
Найти наименьший элемент прямоугольной матрицы, заполненной случайными числами C++
C++ Переместить вниз строки массива, в которых сумма элементов строки меньше ноля
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13953 / 8784 / 1221
Регистрация: 24.12.2010
Сообщений: 15,891
27.02.2013, 14:51     Ячейка заполненной строки не перезаписывается #2
Цитата Сообщение от Jeironica Посмотреть сообщение
x=='*';
== - это сравнение. Наверное, вы имели в виду x = '*';
Jeironica
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 16
27.02.2013, 15:08  [ТС]     Ячейка заполненной строки не перезаписывается #3
Возможно, но это упрощённый код и когда я пробовала присвоить ячейке значение другого массива, было то же самое. при проверке ошибок нет, но программа выдаёт ошибку на этапе выполнения.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.02.2013, 16:01     Ячейка заполненной строки не перезаписывается #4
Цитата Сообщение от Jeironica Посмотреть сообщение
ar="0123456789";
C++
1
strcpy(ar, "0123456789");
Байт
 Аватар для Байт
13953 / 8784 / 1221
Регистрация: 24.12.2010
Сообщений: 15,891
27.02.2013, 18:13     Ячейка заполненной строки не перезаписывается #5
Но вообще-то по этой выжимке можно понять только одно. Если в 5-ти строчках сделано столько ошибок, то что же творится в полном коде! Даже линейно апроксимировать страшно!

Добавлено через 5 минут
ЗЫ. Любопытно посмотреть, что произойдет, когда ТС сделает
C++
1
delete ar;
Jeironica
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 16
01.03.2013, 13:44  [ТС]     Ячейка заполненной строки не перезаписывается #6
easybudda, надо не в в массив ar поместить "0123456789", а в уже записанной в ar строке перезаписать всего несколько ячеек. И вот, если массив пустой, то делается это без проблем, а заполненный строкой массив не перезаписывается...

Байт, да нет, всё нормально, это на среднего размера программу ЕДИНСТВЕННАЯ ошибка, просто для удобства я эту программу обрезала. Считаю, что видеть всё необходимое сразу гораздо удобнее, чем искать полчаса. Или вы со мной не согласны)? Вообще-то программы пытаюсь писать чисто и без ошибок.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 13:55     Ячейка заполненной строки не перезаписывается #7
Jeironica, ar после следующей строки:
ar="0123456789";
более не указывает на выделенный массив. А указывает на новую строку символов.
Обращение по индексу к строкам с использованием указателя на них - запрещено.

C++
1
2
3
char ar[] = "0123456789"; 
    ar[4]='*';
    cout << ar[4];
Вот - приемлемый вариант
Байт
 Аватар для Байт
13953 / 8784 / 1221
Регистрация: 24.12.2010
Сообщений: 15,891
01.03.2013, 14:37     Ячейка заполненной строки не перезаписывается #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Jeironica, Давно хотел тут написать, но лапы как-то не доходили.
В том, что вы выделили проблемный код из большой программы - это совершенно правильный подход. Грамотный и гуманный. Теперь надо чтобы выделенная часть вела себя так же плохо, как и большая программа. Если это не так, то проблема в другом месте.
Надеюсь, что вы проверили плохое поведение этого куска. Теперь надо этот кусок буквально, т.е скопировав (а не переписав) прислать на форум. Место с x=='*'; меня смутило, в том смысле, что вы именно переписали, тем самым к уже существовавшим ошибкам добавили ошибки переписывания.
Ладно, это все методика, а теперь по существу вашего кода.
Есть указатель ar. Вы говорите ar = new char[12]. Что происходит. В куче выделяется кусок памяти на 12 байт и в ar помещается ссылка на этот кусок (адрес этого куска). Далее ar = "123456789"; Что теперь. В ar помещается адрес статической памяти, где находится строка "123456789". Результат предыдущей операции (ar = new...) затирается, в куче появляется мусор (память выделенная оператором new) которая уже совершенно недостижима, т.к. нету на нее указателя, и не сможет быть никогда освобождена. В вашем коде строчку ar = new... можно совершенно спокойно выбросить, только лучше станет.
Значит так. После ar = "12..."; он указывает на статическую памятью. И ar[4] = x; должен записывать в эту статическую память. И вот тут разные компиляторы ведут себя по-разному. Некоторые (старинные) позволяют в нее писать. Другие (более продвинутые) - запрещают. Что, если подумать - логично. Чтоб вас не запутать (видите, для объяснения 3-х строчек простого кода пришлось целое эссе генерить ) даю правильный вариант
C++
1
2
3
4
 char *ar = new char[12];
strcpy(ar, "0123456789"); // как учил [b]easybudda[/b]
char x = '*';
ar[4] = x;
Удачи!

Добавлено через 1 минуту
ITcrusader, опередили.
Но думаю и мое не повредит...

Добавлено через 14 минут
Хочу еще добавить. Очень похожие выражения
C
1
2
 char ar[] = "012345";
char *ar = "012345";
делают совершенно разные вещи. В первом случае в стеке выделяется 7 байтов и туда помещается строка (наподобие strcat).
Во втором память выделяется для указателя (обычно 4 байта) и в него помещается адрес на статическую память.
Хоть и говорят часто, что в Си массив и указатель это одно и тоже, но в самом деле это не совсем так.
Jeironica
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 16
09.03.2013, 17:59  [ТС]     Ячейка заполненной строки не перезаписывается #9
Угу, всё ясно, порграмма, наконец-то, работает. Ребята, спасибо всем Особенно Байту, т.к. по-началу, до меня не дошло, что для того, чтобы перезаписать один символ строки, надо воспользоваться strcpy и без этого объяснения и не дошло бы. Прошу прощения, что долго не отвечала, я не забила, просто пишу не из дому, и отсюда можно писать только в определённое время, а я его просыпаю >_> Спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 18:58     Ячейка заполненной строки не перезаписывается
Еще ссылки по теме:

От класса Таблица унаследовать класс Ячейка C++
C++ Не перезаписывается файл. Работа с fstream
Односвязные списки - элемент перезаписывается C++

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

Или воспользуйтесь поиском по форуму:
Байт
 Аватар для Байт
13953 / 8784 / 1221
Регистрация: 24.12.2010
Сообщений: 15,891
09.03.2013, 18:58     Ячейка заполненной строки не перезаписывается #10
Цитата Сообщение от Jeironica Посмотреть сообщение
я его просыпаю
Сон программистки - священен! Не будите ее. Вам же хуже будет! С запозданием - Поздравляю...
Yandex
Объявления
09.03.2013, 18:58     Ячейка заполненной строки не перезаписывается
Ответ Создать тему
Опции темы

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