Infinity20
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 25
|
|||||||||||
1 | |||||||||||
Выводятся две строки подряд при выводе лишь одной20.08.2014, 11:23. Просмотров 550. Ответов 7
Метки нет Все метки)
(
Баловался со строками. Возник вопрос.
Есть код:
Выведет это: abcde. Вводим данные в str2,например, klmn. Далее, выведет это: klmn//cout << str2 << endl; abcdklmn//cout << str1 << endl; Почему так работает?cin.clear(); после каждого ввода не помогает. Ещё заметил, если выделить память динамически, всё работает как надо:
abcde // str1 klmn // str2 abcde // str1
0
|
|
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
20.08.2014, 11:23 |
Ответы с готовыми решениями:
7
При выводе массива выводятся лишние непонятные символы При выводе динамической матрицы выводятся непонятные цифры Построчное чтение файла в консоли - выводятся две строки подряд При выводе строки в терминал выводятся неизвестные символы при выводе записей из базы они выводятся в одну строчку, а надо чтобы каждая запись начиналась с новой строки. |
SatanaXIII
Почетный модератор
![]() |
|
20.08.2014, 11:37 | 2 |
Потому что в конце первого массива не ставится нуль-терминатор.
Добавлено через 2 минуты Строковые литералы от Evg
0
|
tehnar5
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
|
20.08.2014, 11:38 | 3 |
Представим память в виде массива. По всей видимости, происходит нечто следующее:
Сначала вы берете и помещаете в память две пустые строки. Это значит, что у вас есть два указателя - str1 и str2, которым нужно выделить только одну ячейку памяти(чтобы записать в нее 0 - символ конца строки). Эти блоки памяти могут быть расположены как угодно и где угодно, например, они могут быть расположены близко друг к другу. В Вашем случае они расположены как-то так: ....x...y...., где х - начало первой строки, а у - начало второй строки. Соответственно, после считывания первой строки память выглядит так: .....abcd0...., первая строка начинается с а, вторая с 0. Вывод будет работать корректно, так как он выводит по одному символу, пока не встретится 0. После считывания второй строки память выглядит так: ..abcdklmn0.., вторая строка так же выведется корректно, но теперь, технически, первая строка стала длиннее, так как ближайший справа 0 стал дальше. Иными словами, если Вы не выделили память/выделили ее мало, то программа вполне может залезть в чужую память. В лучшем случае, это будет память другого процесса и тогда она вылетит с ошибкой, в худшем - это будет какая-то другая переменная. Как мне кажется, второй вариант тоже не правилен, так как надо указывать размер выделяемой памяти, но, по всей видимости, Вам повезло и память выделилась по-другому, подальше друг от друга. Самый правильный способ это new char[maxlength + 1], +1 нужен для того, чтобы хранить 0 - символ конца строки
0
|
Voivoid
710 / 282 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
|
|
20.08.2014, 12:11 | 4 |
Только если у тебя windows 95
![]() Самый правильный способ это std::string
0
|
20.08.2014, 12:11 | |
tehnar5
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
|
20.08.2014, 12:30 | 5 |
Да ладно, ведь если обратиться к str[10000000], то уж наверняка мы выйдем из памяти данного процесса. Другое дело, что система нам не позволит ничего сделать, но, по сути, выход произошел
0
|
Voivoid
710 / 282 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
|
|
20.08.2014, 12:54 | 7 |
Ну, это конечно все зависит от ОС, но если ты про windows, то думаю самое время тебе почитать про механизм виртуальной памяти
0
|
Alex5
1126 / 785 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
20.08.2014, 15:28 | 8 | |||||
Как строки расположены в памяти - см. рис.
Кликните здесь для просмотра всего текста
В Вашем случае, Infinity20, видимо, адреса str1 и str2 отличаются на 4 байта. (Подробнее, см. сообщение #3 от tehnar5 ).
0
|
20.08.2014, 15:28 | |
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
20.08.2014, 15:28 |
При выводе таблицы не выводятся знчения функции При выводе русского текста в файл выводятся крякозябры
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |