Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
1

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

21.04.2014, 02:35. Показов 3930. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мой черновой вариант кода. Он очень черновой так что многое не суть важно, но переменной х я присваиваю значение 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");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2014, 02:35
Ответы с готовыми решениями:

Почему не присваивается значение переменной status типа ProductState (это я enum прописывал)
В конструкторе класса Product в зависимости от температуры в поле статус устанавливается одно из 3...

Не присваивается значение переменной, при только положительных числах массива, при наличии отрицательных, присваивается
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; void main() { setlocale(LC_ALL,...

Задать каждому полю переменной value типа Т произвольное начальное значение в строке инициализации переменной
Дан следующий тип данных: struct T { double* p; int* c; struct _T { int a; int b; }; int a; int b;...

Не присваивается значение переменной
У меня есть объект класса Bag, который хранит в себе объекты типа Product, для чего я писал свой...

Не присваивается значение переменной
Привет всем форумчанам! :) Собственно само задание в прикрепленных изображениях. Независимо от...

20
1 / 1 / 1
Регистрация: 20.04.2014
Сообщений: 35
21.04.2014, 02:47 2
это происходит из-за того, что объем памяти, который выделяется под переменную (под х = 4 байта (32 бит)) не может вместить настолько большое число.
если в вашей программе требуется вводить абсолютно любое число, тогда посоветую разобраться с getchar(), а число хранить в виде массива (для каждого элемента массива по одной цифре введенного числа)
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 02:53  [ТС] 3
Uzkesh, я не чего не присваиваю х. Смотрите внимательнее)
0
1 / 1 / 1
Регистрация: 20.04.2014
Сообщений: 35
21.04.2014, 02:56 4
ну к str..под него выделяется и того меньше = 1 байт (8 бит)
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 02:58  [ТС] 5
Uzkesh, и str это массив, понятное дело что такое число он принять не может, но вопрос причем тут бедная переменная х, а не то почему число не сохраняется полностью.
0
1 / 1 / 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) и будет выдаваться запрос на продолжение
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 03:10  [ТС] 7
Uzkesh, переменная х не является элементом массива, понятно что собака зарыта в длине числа, но меня не интересует вопрос как сделать так чтобы вся эта конструкция работала, это я и так знаю. Меня интересует развернутый ответ почему так происходит! Это черновая программа, т.е. while (z='0') это я действительно ошибся сказывается делфи, но эту ошибку я быстро бы нашел. На данный момент меня интересует только этот кусок кода связанный с х. А переменная х нигде не изменяется потому что это черновой вариант, она будет изменяться!
0
Заблокирован
21.04.2014, 04:20 8
строка 7
C++
1
char str[BUFSIZ];
строка 9
C++
1
cin.getline (str, BUFSIZ);
1
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 04:23  [ТС] 9
IrineK, почему на вопрос из-за чего это происходит, ты получаешь ответ как исправить?
0
Заблокирован
21.04.2014, 04:25 10
Если ваша цель в том, чтобы "это" происходило, то отвечать в самом деле не надо.
1
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 04:35  [ТС] 11
IrineK, моя цель понять причины и понимать что я делаю. Тогда столкнувшись с подобной проблемой мне не придется спрашивать не у кого совета. Я знаю как эту проблему обойти. Да я потом проанализирую ваш вариант и возможно он очень удачен, но я все таки спрашивал причину).
0
Заблокирован
21.04.2014, 04:43 12
Лучший ответ Сообщение было отмечено ыфырф1992 как решение

Решение

Причину уже назвали
Цитата Сообщение от Uzkesh Посмотреть сообщение
строку (массив) надо закрыть символом конца строки "\0"
Никогда не считывайте строку голым cin - это небезопасно, т.к. при буфере N и считывании N+1 символов ваша строка не закроется.

getline() закрывает строку в любом случае. Если вы ввели m<=N символов, он закроет ее на m+1 позиции, если больше - то обрубит и закроет на N+1.
1
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 04:59  [ТС] 13
Цитата Сообщение от IrineK Посмотреть сообщение
Причину уже назвали
Я ее не распознал как причину так как ума у меня не хватило на большее чем после завершения считывания принудительно переписать последний символ на 0. Ладно cin не безопасно подробнее загуглю. Но все таки у меня все равно не укладывается а и б в голове. Я бы понял если бы за не имением места в массиве компилятор записывал в случайную переменную и этой переменной в моем случае была бы х. Так что я все равно причину до конца не осознал. Я понял в чем она закл., но как это работает не понял. Подскажите хотя бы как загуглить что бы найти ответ на свой вопрос
0
Заблокирован
21.04.2014, 05:09 14
Лучший ответ Сообщение было отмечено ыфырф1992 как решение

Решение

Поставьте указатели на каждую переменную и проследите где они сидят по адресам в памяти, если вас заинтересовала ситуация.
У вас переменные создаются в стеке, а вы его рушите и поэтому получаете сюрпризы.
1
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 05:10  [ТС] 15
IrineK, ок сделаю как вы сказали
0
Заблокирован
21.04.2014, 05:25 16
Если будет что-то интересное, выложите в продолжении этой темы.
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
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
0
Заблокирован
21.04.2014, 18:04 18
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
integer 2 байтовый
выведите sizeof(int)
в самом деле 2-байтовый?
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
21.04.2014, 18:17  [ТС] 19
IrineK, минуту не получается загрузить изображения. Не я на картинки взял для упрощения взял 2 байтовый это смысл не изменит. Загружу увидете


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

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

P.S. int - по всяком случае в VS - 4-байтный.
1
21.04.2014, 19:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2014, 19:11
Помогаю со студенческими работами здесь

Не присваивается значение переменной в конструкции if-else
В чем может быть проблема? #include &lt;iostream&gt; using namespace std; int main() { int...

Переменной float значение присваивается с некоторой погрешностью
Доброго всем времени суток! В С++ Builder 6 при отладке кода не могу понять следующий момент:...

Почему переменной не присваивается значение?
Столкнулся в программе с необъяснимой ошибкой - в строке 94 ячейке массива не присваивается...

Почему переменной не присваивается суммовое значение
Range(&quot;D1&quot;).Formula = &quot;=COUNT(B2:B1000)&quot; Range(&quot;E1&quot;).Formula = &quot;=SUM(C2:C1000)&quot; Dim e As...

Подскажите почему не присваивается значение переменной c типом char?
Здравствуйте. Я только начал изучать С# , не могу разобраться с данной ситуацией. В списке ошибок...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru