3 / 3 / 3
Регистрация: 21.10.2014
Сообщений: 113
1

В терминале в переменной автоматически заполняется "null"

23.01.2017, 15:15. Показов 916. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Имеется код:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <stdafx.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
 
using namespace std;
 
struct LIBRARY
{
    char nomer[30];
    char FIO[30];
    char nazvanie[40];
    int Year;
    int kolvo;
};
 
struct STR
{
    LIBRARY *Library;
    STR *next;
};
 
STR * create(LIBRARY * Library) //начальное формирование списка
{
    STR *root = new STR;
    root->Library = Library;
    root->next = NULL;
    return root;
}
 
void add(LIBRARY *Library, STR* root) //добавление нового элемента списка
{
    while (root->next)
        root = root->next;
    root->next = new STR;
    root->next->Library = Library;
    root->next->next = NULL;
}
 
void printLIBRARY(LIBRARY *Library) //вывод на экран  
{
 
    cout << "Номер => " << Library->nomer << endl;
    cout << "ФИО => " << Library->FIO << endl;
    cout << "Название => " << Library->nazvanie << endl;
    cout << "Год => " << Library->Year << endl;
    cout << "Кол-во => " << Library->kolvo << endl;
    cout << endl;
 
}
 
LIBRARY * makeLIBRARY() //добавление книги
{
    cout << "Введите данные книги:" << endl;
    LIBRARY *Library = new LIBRARY;
    fflush(stdin);
    cout << "Введите номер книги: => ";
    cin.getline(Library->nomer, 30);
 
    cout << "Введие ФИО автора:  => ";
    cin.getline(Library->FIO, 30);
 
    cout << "Введите название книги: => ";
    cin.getline(Library->nazvanie, 40);
 
    cout << "Введите год издания:  => ";
    cin >> Library->Year;
 
    cout << "Введите кол-во книг:  => ";
    cin >> Library->kolvo;
 
    return Library;
}
 
int choice()
{
    int answer;
    cout << "Главное меню" << endl;
    cout << "1. Добавить новую книгу в список" << endl;
    cout << "2. Вывести библиотеку из списка" << endl;
    cout << "3. Поиск и удалеие" << endl;
    cout << "4. Очистить все записи" << endl;
    cout << "5. Выход" << endl;
    cout << "Введите номер команды: ";
    cin >> answer;
    fflush(stdin);
    if (answer >= 1 && answer <= 5)
        return answer;
    else
        return 0;
}
 
STR* search_and_del(STR * str)
{
    STR *last = str, *root = str;
    char qwe[30];
    char qw[30], q[1];
    cout << "Введите номер книги => " << endl;
    cin.getline(qwe, 30);
    while (root)
    {
        if (!strcmp(qwe, root->Library->nomer))
        {
            {
                printLIBRARY(root->Library);
                cout << "Вы хотите очистить эти записи? (y/n) " << endl;// Удаление записи
                char c;
                cin.get(c);
                if (c == 'y')
                {
                    root->Library = NULL;
                    if (last == root) str = root->next;
                    else last->next = root->next;
                }
                while (cin.get(c) && c != '\n');
                last = root;
                root = root->next;
            }
        }
        else if (strcmp(qwe, root->Library->nomer))
            root = root->next;
    }
 
    cout << "Записи удалены" << endl;
    return str;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    STR *root = NULL;
    int ch;
    while (1)
    {
        ch = choice();
        if (ch == 1)
        {
            cout << endl;
            if (root == NULL)
                root = create(makeLIBRARY());
            else
                add(makeLIBRARY(), root);
        }
 
        else if (ch == 2)
        {
            cout << endl;
            int i = 0;
            int N = 0;
 
            STR *proot = root;
            while (root)
            {
                N++;
                root = root->next;
            }
 
            LIBRARY *buf;
            LIBRARY **pLibrary = new LIBRARY*[N];
            root = proot;
 
            while (root)
            {
                pLibrary[i] = root->Library;
                root = root->next;
                i++;
            }
 
            root = proot;
 
 
            for (i = 0; i<N; i++)
                printLIBRARY(pLibrary[i]);
 
        }
 
        else if (ch == 3)
        {
            root = search_and_del(root);
        }
 
        else if (ch == 4)
        {
            char e;
            cout << "Вы хотите очистить эти записи (y/n) " << endl;// Удаление всех записей
            cin.get(e);
            if (e == 'y')
            {
                root = NULL;
                cout << "Все записи успешно удалены!" << endl;
            }
            else if (e == 'n') cout << endl;
            while (cin.get(e) && e != '\n');
        }
 
        else if (ch == 5)
        {
            break;
            cout << endl;
        }
 
    }
    return 0;
}
Проблема в том, что при выборе "1" (добавление книги), выводит:
Bash
1
2
Введите данные книги:
Введите номер книги => Введите ФИО автора =>
т.е. номер записывает автоматически как null.
Как решить проблема, код пересматривал, ничего не находил...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2017, 15:15
Ответы с готовыми решениями:

DatePicker заполняется автоматически
Есть 2 DatePicker и 1 ComboBox (в ComboBox цифры 1,2,3). Выбираем дату в первом DatePicker и...

Значение поля Скидка не заполняется автоматически
Доброе утро! Не могу автоматически получить скидку. Выдаёт ошибку:...

Почему первичный ключ не заполняется автоматически?
Хочу, чтобы id автоматически нумеровалось 1, 2, 3 и тд, но оно у меня не заполняется? Что я делаю...

Идентификатор не заполняется автоматически при установленном IDENTITY(1,1)
В проекте Visual Studio создал БД, создал в ней таблицу. Добавил к одному из полей IDENTITY(1,1) (...

3
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.01.2017, 15:41 2
Скорее всего, проблема в считывании строки с потока, в котором остаётся '\n'. Используйте std::cin.ignore().
0
3 / 3 / 3
Регистрация: 21.10.2014
Сообщений: 113
23.01.2017, 16:37  [ТС] 3
простите, но не могу найти '\n' для первой команды
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
23.01.2017, 16:49 4
Лучший ответ Сообщение было отмечено ArturKaktus как решение

Решение

MrGluck предлагает заменить
C++
1
2
    cin >> answer;
    fflush(stdin);
на

C++
1
2
    cin >> answer;
    cin.ignore();
(Функция fflush очищает выходной буфер, а не входной. Она в этом контексте не актуальна.

Не по теме:

Если точнее, то не очищает, а сбрасывает содержимое буфера в поток.

)

Проблема состоит в том, что когда в консоле вы вводите "12",
на самом деле вы вводите "12\n", где '\n' - это символ переноса строки.
Оператор cin >> answer; достаёт из потока только число 12. Символ переноса строки остается в потоке и вредит при последующем чтении. Поэтому его нужно сбросить вручную. Если этого не сделать, то следующий вызов cin.getline интерпретирует содержимое потока как ввод пустой строки.

В дальнейшем вы пользуютесь функцией cin.getline, которая отбрасывание символа конца строки выполняет автоматически, поэтому такой проблемы дальше не возникает.
0
23.01.2017, 16:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2017, 16:49
Помогаю со студенческими работами здесь

После первых букв поле заполняется автоматически
Добрый день! Если кто в курсе подскажите. Есть поле (месяц) в форме, как сделать, чтобы...

Заполнить двумерный массив n×n по образцу. Матрица заполняется автоматически для любого n
Заполнить двумерный массив n×n по образцу. Матрица заполняется автоматически для любого n. Образец...

Удаление слов из строки, не привыкающих заданную заранее длину. Строка заполняется автоматически
Здравствуйте. Вот такая проблема. Ниже представлен код программы, написанной в c++ builder. Вопрос...

Автоматически считать null как false
Здравствуйте, уже устал писать If(variable != null) Можно ли сделать, что бы null автоматически...

Почему delete не устанавливает автоматически указатель в NULL?
Почему delete не устанавливает автоматически указатель в NULL?

Передать NULL в переменной
Всем привет! $db = new PDO( 'sqlite:base.db' ); $sth = $db-&gt;prepare( 'SELECT * FROM Table1...

Передать NULL в переменной
Всем привет! $sth = $db-&gt;prepare( 'SELECT * FROM Table1 WHERE comment IS ?' ); if (...


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

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

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