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

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

Войти
Регистрация
Восстановить пароль
 
Jeironica
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 16
#1

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

27.02.2013, 14:48. Просмотров 351. Ответов 9
Метки нет (Все метки)

Есть массив со строкой. Одну из его ячеек необходимо перезаписать, но этого не получается. Используемое ПО - 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;
}
Заранее спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 14:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ячейка заполненной строки не перезаписывается (C++):

Односвязные списки - элемент перезаписывается - C++
Помогите пожалуйста функция добавления элемента: void AddSpisok(SpisokSport **begin) { SpisokSport *end; if(*begin==NULL) { ...

Не перезаписывается файл. Работа с fstream - C++
Есть такой код std::fstream settingFile; Poco::Util::Application&amp; app = Poco::Util::Application::instance(); std::string...

Двухмерный массив строк, каждый раз перезаписывается значение - C++
Здравствуйте, нужна Ваша помощь в следующем: char * UserData = { new char, new char, new char, new char }; char ***...

Матрицы. Поиск области, заполненной единицами. C++ - C++
Такая задача: Дана матрица, заполненная нулями и единицами. Нужно вывести на экран максимальную область, заполненную единицами. Область...

Вычислить сумму элементов целочисленной матрицы, заполненной случайными числами - C++
Написать приложение, которое считает сумму элементов матрицы. Дана целочисленная матрица. Она заполнена случайными числами интервала,...

Найти наименьший элемент прямоугольной матрицы, заполненной случайными числами - C++
2.Найти наименьший элемент прямоугольной матрицы X(20х10), заполненной случайными числами на отрезке от -10 до 50 и вывести на экран номер...

9
Байт
Эксперт C
17649 / 11687 / 1863
Регистрация: 24.12.2010
Сообщений: 23,293
27.02.2013, 14:51 #2
Цитата Сообщение от Jeironica Посмотреть сообщение
x=='*';
== - это сравнение. Наверное, вы имели в виду x = '*';
0
Jeironica
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 16
27.02.2013, 15:08  [ТС] #3
Возможно, но это упрощённый код и когда я пробовала присвоить ячейке значение другого массива, было то же самое. при проверке ошибок нет, но программа выдаёт ошибку на этапе выполнения.
0
easybudda
Модератор
Эксперт CЭксперт С++
9967 / 5890 / 996
Регистрация: 25.07.2009
Сообщений: 11,149
27.02.2013, 16:01 #4
Цитата Сообщение от Jeironica Посмотреть сообщение
ar="0123456789";
C++
1
strcpy(ar, "0123456789");
1
Байт
Эксперт C
17649 / 11687 / 1863
Регистрация: 24.12.2010
Сообщений: 23,293
27.02.2013, 18:13 #5
Но вообще-то по этой выжимке можно понять только одно. Если в 5-ти строчках сделано столько ошибок, то что же творится в полном коде! Даже линейно апроксимировать страшно!

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

Байт, да нет, всё нормально, это на среднего размера программу ЕДИНСТВЕННАЯ ошибка, просто для удобства я эту программу обрезала. Считаю, что видеть всё необходимое сразу гораздо удобнее, чем искать полчаса. Или вы со мной не согласны)? Вообще-то программы пытаюсь писать чисто и без ошибок.
0
ITcrusader
Эксперт С++
177 / 163 / 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];
Вот - приемлемый вариант
0
Байт
Эксперт C
17649 / 11687 / 1863
Регистрация: 24.12.2010
Сообщений: 23,293
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 байта) и в него помещается адрес на статическую память.
Хоть и говорят часто, что в Си массив и указатель это одно и тоже, но в самом деле это не совсем так.
0
Jeironica
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 16
09.03.2013, 17:59  [ТС] #9
Угу, всё ясно, порграмма, наконец-то, работает. Ребята, спасибо всем Особенно Байту, т.к. по-началу, до меня не дошло, что для того, чтобы перезаписать один символ строки, надо воспользоваться strcpy и без этого объяснения и не дошло бы. Прошу прощения, что долго не отвечала, я не забила, просто пишу не из дому, и отсюда можно писать только в определённое время, а я его просыпаю >_> Спасибо!
0
Байт
Эксперт C
17649 / 11687 / 1863
Регистрация: 24.12.2010
Сообщений: 23,293
09.03.2013, 18:58 #10
Цитата Сообщение от Jeironica Посмотреть сообщение
я его просыпаю
Сон программистки - священен! Не будите ее. Вам же хуже будет! С запозданием - Поздравляю...
1
09.03.2013, 18:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 18:58
Привет! Вот еще темы с ответами:

В квадратной матрице, заполненной нулями и единицами, переставить элементы согласно условию - C++
Здравствуйте. Есть такое задание: Дан массив 8х8. Нужно вводить нули и единицы (одна единица в строке). На экран вывести исходный...

В матрице размера mxn заполненной с клавиатуры поменять местами первый и последний столбцы - C++
кто знает как на с++ написать данную программу, помогите пожалуйста. заранее спасибо! в матрице размера mxn заполненной с клавиатуры...

Среди столбцов заданной целочисленной матрицы, заполненной случайными числами, порядка n* n, найти столбец с элементами - C++
что не так? Среди столбцов заданной целочисленной матрицы, заполненной случайными числами, порядка n* n, найти столбец с элементами...

Не перезаписывается ячейка в массиве - PHP
вот мой код: foreach ($arr as $k =&gt; $v) { echo $k .&quot; &quot;. $v .&quot; &quot;. $v .&quot; &quot;. $v . &quot; &quot;.&quot; &quot;. $v . &quot;&lt;br&gt;&quot;; ...


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

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

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