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

Почему переменной присваивается произвольное значение("мусор")? - C++

Восстановить пароль Регистрация
 
 
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 02:35     Почему переменной присваивается произвольное значение("мусор")? #1
Мой черновой вариант кода. Он очень черновой так что многое не суть важно, но переменной х я присваиваю значение 0. Если после приглашения ввести набор чисел, мы введем что вроде 11111111111111111111111111111111111111111111111111111, то после нажатие enter х получает произвольное значение. Вопрос почему? Проблема решается перестановкой объявления х. Но я хочу понять почему так происходит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<clocale>
using std::cout;using std::endl;using std::cin;
int main() {
    std::setlocale(LC_ALL, "Russian_Russia.1251");char z='1';int x=0;
    do {
    char str[25]={0};
    cout<<"Введите набор чисел, буквы из ряда чисел будут убраны автоматически, нельзя вводить ряд из одних букв или ряд длинее 20 символов"<<endl;
    cin>>str;
    for(int i=0;i<25;i++){ 
        if (str[20]!='\0'){cout<<"Ряд слишком линный пожалуста Введите более короткий ряд"<<endl;cin.ignore(255, '\n');break;}
        if (!(str[i]>47 && str[i]<58)&& str[i]!='\0'){
            for (int p=i;p<22;p++){
                str[p]=str[p+1];
            }
        i--;} 
    }
    if (x>=2) {
        cout<<"Если хотите окончить нажмите 0"<<endl;
        z=cin.get();
    }
    for(int i=0;i<25 && str[i]!='\0';i++){cout<<str[i]<<endl;}
    }
    while(z='0');
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2014, 02:35     Почему переменной присваивается произвольное значение("мусор")?
Посмотрите здесь:

Подскажите почему может появляться ошибка: "неразрешенный внешний символ "_SDL_..."" C++
C++ Вычищает ли "мусор" команда delete
C++ Error: значение типа "const char" нельзя присвоить сущности типа "double"
Аналог рекурсивной функции, отображающей строку в обратном порядке, выводит "мусор" C++
C++ Как "выдрать" значение переменной из цикла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Uzkesh
0 / 0 / 1
Регистрация: 20.04.2014
Сообщений: 35
21.04.2014, 02:47     Почему переменной присваивается произвольное значение("мусор")? #2
это происходит из-за того, что объем памяти, который выделяется под переменную (под х = 4 байта (32 бит)) не может вместить настолько большое число.
если в вашей программе требуется вводить абсолютно любое число, тогда посоветую разобраться с getchar(), а число хранить в виде массива (для каждого элемента массива по одной цифре введенного числа)
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 02:53  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #3
Uzkesh, я не чего не присваиваю х. Смотрите внимательнее)
Uzkesh
0 / 0 / 1
Регистрация: 20.04.2014
Сообщений: 35
21.04.2014, 02:56     Почему переменной присваивается произвольное значение("мусор")? #4
ну к str..под него выделяется и того меньше = 1 байт (8 бит)
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 02:58  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #5
Uzkesh, и str это массив, понятное дело что такое число он принять не может, но вопрос причем тут бедная переменная х, а не то почему число не сохраняется полностью.
Uzkesh
0 / 0 / 1
Регистрация: 20.04.2014
Сообщений: 35
21.04.2014, 03:06     Почему переменной присваивается произвольное значение("мусор")? #6
так, я вгляделся) смотрите, если вы в str (массив) вводите какую то информацию, то это строку (массив) надо закрыть символом конца строки "\0", что бы в оставшиеся элементы массива не попал этот самый мусор

Добавлено через 5 минут
х у вас не изменяется ни на каком этапе программы. да и проверка условия while (z='0') не является проверкой, так как надо использовать while (z=='0'), в вашем случае '0' присваивается в z.
вы можете просто убрать проверку условия if (x>=2) и будет выдаваться запрос на продолжение
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 03:10  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #7
Uzkesh, переменная х не является элементом массива, понятно что собака зарыта в длине числа, но меня не интересует вопрос как сделать так чтобы вся эта конструкция работала, это я и так знаю. Меня интересует развернутый ответ почему так происходит! Это черновая программа, т.е. while (z='0') это я действительно ошибся сказывается делфи, но эту ошибку я быстро бы нашел. На данный момент меня интересует только этот кусок кода связанный с х. А переменная х нигде не изменяется потому что это черновой вариант, она будет изменяться!
IrineK
Заблокирован
21.04.2014, 04:20     Почему переменной присваивается произвольное значение("мусор")? #8
строка 7
C++
1
char str[BUFSIZ];
строка 9
C++
1
cin.getline (str, BUFSIZ);
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 04:23  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #9
IrineK, почему на вопрос из-за чего это происходит, ты получаешь ответ как исправить?
IrineK
Заблокирован
21.04.2014, 04:25     Почему переменной присваивается произвольное значение("мусор")? #10
Если ваша цель в том, чтобы "это" происходило, то отвечать в самом деле не надо.
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 04:35  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #11
IrineK, моя цель понять причины и понимать что я делаю. Тогда столкнувшись с подобной проблемой мне не придется спрашивать не у кого совета. Я знаю как эту проблему обойти. Да я потом проанализирую ваш вариант и возможно он очень удачен, но я все таки спрашивал причину).
IrineK
Заблокирован
21.04.2014, 04:43     Почему переменной присваивается произвольное значение("мусор")? #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Причину уже назвали
Цитата Сообщение от Uzkesh Посмотреть сообщение
строку (массив) надо закрыть символом конца строки "\0"
Никогда не считывайте строку голым cin - это небезопасно, т.к. при буфере N и считывании N+1 символов ваша строка не закроется.

getline() закрывает строку в любом случае. Если вы ввели m<=N символов, он закроет ее на m+1 позиции, если больше - то обрубит и закроет на N+1.
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 04:59  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #13
Цитата Сообщение от IrineK Посмотреть сообщение
Причину уже назвали
Я ее не распознал как причину так как ума у меня не хватило на большее чем после завершения считывания принудительно переписать последний символ на 0. Ладно cin не безопасно подробнее загуглю. Но все таки у меня все равно не укладывается а и б в голове. Я бы понял если бы за не имением места в массиве компилятор записывал в случайную переменную и этой переменной в моем случае была бы х. Так что я все равно причину до конца не осознал. Я понял в чем она закл., но как это работает не понял. Подскажите хотя бы как загуглить что бы найти ответ на свой вопрос
IrineK
Заблокирован
21.04.2014, 05:09     Почему переменной присваивается произвольное значение("мусор")? #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Поставьте указатели на каждую переменную и проследите где они сидят по адресам в памяти, если вас заинтересовала ситуация.
У вас переменные создаются в стеке, а вы его рушите и поэтому получаете сюрпризы.
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 05:10  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #15
IrineK, ок сделаю как вы сказали
IrineK
Заблокирован
21.04.2014, 05:25     Почему переменной присваивается произвольное значение("мусор")? #16
Если будет что-то интересное, выложите в продолжении этой темы.
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 17:55  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #17
IrineK, я бы хотел для начала уточнить как выглядит стек в c++. Для упрощения я взял integer 2 байтовый.
C++
1
2
3
4
5
char str[4]={0};
int x;// для первой картинки
 
char str[1]={0};
int x;//для 2
IrineK
Заблокирован
21.04.2014, 18:04     Почему переменной присваивается произвольное значение("мусор")? #18
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
integer 2 байтовый
выведите sizeof(int)
в самом деле 2-байтовый?
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 199
21.04.2014, 18:17  [ТС]     Почему переменной присваивается произвольное значение("мусор")? #19
IrineK, минуту не получается загрузить изображения. Не я на картинки взял для упрощения взял 2 байтовый это смысл не изменит. Загружу увидете


IrineK, Я себе стек так представляю хотелось бы понять какой из вариантов правильный.
Миниатюры
Почему переменной присваивается произвольное значение("мусор")?   Почему переменной присваивается произвольное значение("мусор")?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 19:11     Почему переменной присваивается произвольное значение("мусор")?
Еще ссылки по теме:

Выводит "мусор" при считывании файла C++
C++ Почему не работает "system("pause")"?
Подскажите, почему значению функции присваивается true? Что сделать чтобы передавалось значение? C++

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

Или воспользуйтесь поиском по форуму:
IrineK
Заблокирован
21.04.2014, 19:11     Почему переменной присваивается произвольное значение("мусор")? #20
Чтобы увидеть "биг пикчу", погуглите "Организация памяти процесса".
Потом вдавайтесь в детали.

Посмотрите в направлении "Дизассемблирование кода". Может, что-то покажется интересным.

P.S. int - по всяком случае в VS - 4-байтный.
Yandex
Объявления
21.04.2014, 19:11     Почему переменной присваивается произвольное значение("мусор")?
Ответ Создать тему
Опции темы

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