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

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

Войти
Регистрация
Восстановить пароль
 
 
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
#1

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

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

Мой черновой вариант кода. Он очень черновой так что многое не суть важно, но переменной х я присваиваю значение 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2014, 02:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему переменной присваивается произвольное значение("мусор")? (C++):

Индекс элемента массива, для которого значение функции - минимально. "Мусор в выводе" - C++
Собственно поставлена следующая задача: Разработать функцию P, находящую индекс элемента массива Х, для которого зачение функции f...

Почему, при попытке "взять" адрес переменной,компилятор ее не положит на регистр? - C++
почему, при попытке &quot;взять&quot; адрес переменной,компилятор ее не положит на регистр

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

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

Как "выдрать" значение переменной из цикла - C++
В общем. Есть глобальная переменная. Есть цикл в одной из функций, где значение этой переменной с каждым проходом изменяется. Нужно...

Подскажите почему может появляться ошибка: "неразрешенный внешний символ "_SDL_..."" - C++
Привет всем =) Скажите пожалуйста почему у меня пишет: 1&gt;SDL.obj : error LNK2001: неразрешенный внешний символ &quot;_SDL_CreateCursor&quot; ...

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

getline() закрывает строку в любом случае. Если вы ввели m<=N символов, он закроет ее на m+1 позиции, если больше - то обрубит и закроет на N+1.
1
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
21.04.2014, 04:59  [ТС] #13
Цитата Сообщение от IrineK Посмотреть сообщение
Причину уже назвали
Я ее не распознал как причину так как ума у меня не хватило на большее чем после завершения считывания принудительно переписать последний символ на 0. Ладно cin не безопасно подробнее загуглю. Но все таки у меня все равно не укладывается а и б в голове. Я бы понял если бы за не имением места в массиве компилятор записывал в случайную переменную и этой переменной в моем случае была бы х. Так что я все равно причину до конца не осознал. Я понял в чем она закл., но как это работает не понял. Подскажите хотя бы как загуглить что бы найти ответ на свой вопрос
0
IrineK
Заблокирован
21.04.2014, 05:09 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Поставьте указатели на каждую переменную и проследите где они сидят по адресам в памяти, если вас заинтересовала ситуация.
У вас переменные создаются в стеке, а вы его рушите и поэтому получаете сюрпризы.
1
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
21.04.2014, 05:10  [ТС] #15
IrineK, ок сделаю как вы сказали
0
21.04.2014, 05:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 05:10
Привет! Вот еще темы с ответами:

Аналог рекурсивной функции, отображающей строку в обратном порядке, выводит "мусор" - C++
Добрый день, при попытке написать аналог рекурсивной функции отображающей строку в обратном порядке напоролся на грабли: #include...

Выводит "мусор" при считывании файла - C++
Вывод // (c) vladyxa13 #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;locale&gt; #include &lt;fstream&gt; using namespace std; ...

Почему не работает функция std::regex_replace(temp,"amp;",""); - C++
Пробую вызывать функцию std::regex_replace(temp,&quot;amp;&quot;,&quot;&quot;); Пишет ошибку: test_ok_ruDlg.cpp 1&gt;d:\visual studio...

Вычищает ли "мусор" команда delete - C++
Все-таки добил свою учебную программку.) И созрело пару вопросов. Первый, самый важный : команда delete objPat в моем коде вычищает уже не...


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

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

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