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

Выводятся две строки подряд при выводе лишь одной - C++

Восстановить пароль Регистрация
 
Infinity20
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 25
20.08.2014, 11:23     Выводятся две строки подряд при выводе лишь одной #1
Баловался со строками. Возник вопрос.
Есть код:
C++
1
2
3
4
5
6
7
8
9
...
char str1[] = "", str2[] = "";
 
cin >> str1;
cout << str1 << endl;
cin >> str2;
cout << str2 << endl;
cout << str1 << endl;
...
Допустим, мы введём в первую строку это: abcde;
Выведет это: abcde.
Вводим данные в str2,например, klmn.
Далее, выведет это:
klmn//cout << str2 << endl;
abcdklmn//cout << str1 << endl;

Почему так работает?cin.clear(); после каждого ввода не помогает.
Ещё заметил, если выделить память динамически, всё работает как надо:

C++
1
2
3
4
5
6
7
8
char* str1 = new char[];
char* str2 = new char[];
 
cin >> str1;
cout << str1 << endl;
cin >> str2;
cout << str2 << endl;
cout << str1 << endl;
В конце выведет это:
abcde // str1
klmn // str2
abcde // str1
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
20.08.2014, 11:37     Выводятся две строки подряд при выводе лишь одной #2
Цитата Сообщение от Infinity20 Посмотреть сообщение
Почему так работает?
Потому что в конце первого массива не ставится нуль-терминатор.

Добавлено через 2 минуты
Строковые литералы от Evg
tehnar5
31 / 31 / 12
Регистрация: 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 - символ конца строки
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
20.08.2014, 12:11     Выводятся две строки подряд при выводе лишь одной #4
Цитата Сообщение от tehnar5 Посмотреть сообщение
это будет память другого процесса
Только если у тебя windows 95

Цитата Сообщение от tehnar5 Посмотреть сообщение
Самый правильный способ это new char[maxlength + 1]
Самый правильный способ это std::string
tehnar5
31 / 31 / 12
Регистрация: 03.05.2011
Сообщений: 84
20.08.2014, 12:30     Выводятся две строки подряд при выводе лишь одной #5
Цитата Сообщение от Voivoid Посмотреть сообщение
Только если у тебя windows 95
Да ладно, ведь если обратиться к str[10000000], то уж наверняка мы выйдем из памяти данного процесса. Другое дело, что система нам не позволит ничего сделать, но, по сути, выход произошел
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
20.08.2014, 12:48     Выводятся две строки подряд при выводе лишь одной #6
tehnar5, услышит ли кто звук падающего в лесу дерева, если в лесу никого нет?
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
20.08.2014, 12:54     Выводятся две строки подряд при выводе лишь одной #7
Цитата Сообщение от tehnar5 Посмотреть сообщение
Да ладно, ведь если обратиться к str[10000000], то уж наверняка мы выйдем из памяти данного процесса
Ну, это конечно все зависит от ОС, но если ты про windows, то думаю самое время тебе почитать про механизм виртуальной памяти
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 15:28     Выводятся две строки подряд при выводе лишь одной
Еще ссылки по теме:

Заданы две строки одинаковой длины. Построить новую строку, состоящую из символов как одной, так и другой C++
C++ Мусор при выводе не смотря на \0 символ в конце строки
C++ При попытке вывода строки вместо введенных вручную символов выводятся рандомные

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

Или воспользуйтесь поиском по форуму:
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
20.08.2014, 15:28     Выводятся две строки подряд при выводе лишь одной #8
Цитата Сообщение от Infinity20 Посмотреть сообщение
Далее, выведет это:
abcdklmn //cout << str1 << endl;
Как строки расположены в памяти - см. рис.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    char str1[] = "", str2[] = "";
    cout << "address of str1  " << (void*)&str1[0] << endl;
    cout << "address of str2  " << (void*)&str2[0] << endl;
 
    cin >> str1;
    for( char* p  = &str1[0];  p!= &str1[0]+10 ;  ++p )
    {
        cout << "  " << *p;
    }
    cout << endl;
    //cout << str1 << endl;
    
    cin >> str2;
    for( char* p  = &str1[0];  p!= &str1[0]+10 ;  ++p )
    {
        cout << "  " << *p;
    }
    cout << endl;

Цитата Сообщение от Infinity20 Посмотреть сообщение
выведет abcdklmn
В Вашем случае, Infinity20, видимо, адреса str1 и str2 отличаются на 4 байта. (Подробнее, см. сообщение #3 от tehnar5 ).
Миниатюры
Выводятся две строки подряд при выводе лишь одной  
Yandex
Объявления
20.08.2014, 15:28     Выводятся две строки подряд при выводе лишь одной
Ответ Создать тему
Опции темы

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