Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73

Программа игнорирует gets()

23.12.2011, 12:16. Показов 7835. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <stdio.h>
#include <locale.h>
#include <string>
#include <iostream>
using namespace std;
struct NOTE
{
    char **family;
    char **name;
    int *phone;
    int **birthday;
};
void EditRecord(int count, NOTE &Note)
{
    char cccc, ccccc;
    system("cls");
    while(1)
    {
        printf("1.Редактирование фамилии %d записи\n", count);
        printf("2.Редактирование имени %d записи\n", count);
        printf("3.Редактирование номера телефона %d записи\n", count);
        printf("4.Редактирование даты рождения %d записи\n", count);
        printf("5.Возврат в меню выбора номера записи\n");
        scanf("%c", &cccc);
        system("cls");
        switch(cccc)
        {
            case '1':
                Note.family=new char*[count];
                for (int i=0; i<count; i++)
                {
                    Note.family[i]=new char[1];
                }
                printf("Введите фамилию %d записи\n", count);
                gets(Note.family[count-1]);
                printf("Фамилия успешно внесена в запись с номером %d\n", count);
                scanf("%c", &ccccc);
                scanf("%c", &ccccc);
                break;
            case '2':
                Note.name=new char*[count];
                for (int i=0; i<count; i++)
                {
                    Note.name[i]=new char[1];
                }
                printf("Введите имя %d записи\n\n", count);
                gets(Note.name[count-1]);
                printf("Имя успешно внесено в запись с номером %d\n", count);
                scanf("%c", &ccccc);
                scanf("%c", &ccccc);
                break;
            case '3':
                Note.phone=new int[100];
                printf("Введите номер телефона %d записи\n", count);
                scanf("%d", &Note.phone[count-1]);
                printf("Номер телефона успешно внесён в запись с номером %d\n", count);
                scanf("%c", &ccccc);
                scanf("%c", &ccccc);
                break;
            case '4':
                Note.birthday=new int*[count];
                for (int i=0; i<count; i++)
                {
                    Note.birthday[i]=new int[10];
                }
                printf("Введите дату рождения %d записи (формат: дд<пробел>мм<пробел>гггг)\n", count);
                cin>>Note.birthday[count-1][0]>>Note.birthday[count-1][1]>>Note.birthday[count-1][2];
                printf("Дата рождения успешно внесёна в запись с номером %d\n", count);
                scanf("%c", &ccccc);
                scanf("%c", &ccccc);
                break;
            case '5':
                return;
                break;
        }
    }
}
void AddDataFromKeyboard(int &count, NOTE &Note)
{
    char ccc;
    system("cls");
    while(1)
    {
        system("cls");
        printf("1.Ввод номера записи, которую вы хотите отредактировать\n");
        printf("2.Возврат в главное меню\n");
        scanf("%c", &ccc);
        switch(ccc)
        {
            case '1':
                printf("Введите номер записи, которую вы хотите отредактировать\n");
                scanf("%d", &count);
                EditRecord(count, Note);
                break;
            case '2':
                return;
                break;
        }
    }
}
void AddDataFromFile(int &count, NOTE)
{
    FILE *f;
    f=fopen("database.txt", "r");
    if (f==NULL)
    {
        printf ("Файл не открывается");
        return;
    }
    else
    {
        
    }
 
}
void PhoneSearch(int count, NOTE Note)
{
    int phone;
    bool FlagResult=0;
    printf("Введите номер телефона человека, которого вы хотите найти");
    scanf("%d",&phone);
    if (count>0)
    {
        for (int i=0; i<count; i++)
        {
            if (Note.phone[i]==phone)
            {
                printf("%d %d %d %s %s %d",Note.birthday[i][0], Note.birthday[i][1], Note.birthday[i][2], Note.family[i], Note.name[i], Note.phone[i]);
                FlagResult=1;
            }
        }
        if (FlagResult==0)
        {
            printf("Людей с таким номером в базе данных нет");
        }
    }
    else
    {
        printf("База данных пуста");
    }
}
void MonthSearch(int count, NOTE Note)
{
    int month;
    bool FlagResult=0;
    printf("Введите номер месяца рождения человека, которого вы хотите найти");
    scanf("%d",&month);
    if (count>0)
    {
        for (int i=0; i<count; i++)
        {
            if (Note.birthday[count][1]==month)
            {
                printf("%d %d %d %s %s %d", Note.birthday[count][0], Note.birthday[count][1], Note.birthday[i][2], Note.family[count], Note.name[count], Note.phone[count]);
                FlagResult=1;
            }
        }
        if (FlagResult==0)
        {
            printf("Людей с таким номером в базе данных нет");
        }
    }
    if (count<=0)
    {
        printf("База данных пуста");
    }
}
void main()
{
    setlocale(LC_ALL, "russian");
    int count;
    char c, cc;
    NOTE Note;
    system("cls");
    while(1)
    {
        system("cls");
        printf("Работа с базой данных\n\n");
        printf("1.Редактирование данных в базе данных с клавиатуры\n");
        printf("2.Ввод данных в базу данных из файла database.txt\n");
        printf("3.Поиск человека по номеру телефона\n");
        printf("4.Поиск людей по месяцу рождения\n");
        printf("5.Выход из программы\n");
        scanf("%c", &c);
        switch(c)
        {
            case '1':
                AddDataFromKeyboard(count, Note);
                break;
            case '2':
                
            case '3':
                PhoneSearch(count, Note);
                break;
            case '4':
                MonthSearch(count, Note);
                break;
            case '5':
                return;
                break;
        }
    }
}
Проблема в том, что на 35 и 47 строках кода программа почему-то пропускает эти фрагменты кода. Вопрос: почему?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2011, 12:16
Ответы с готовыми решениями:

Программа игнорирует условия
Всем привет. Проблема. При выполнение данной программы выводит результат 4-х операций. Почему if не работает? Я имею ввиду, если...

Программа игнорирует ввод
Если первый файл не найден и выполняется его случайное заполнение, то программа игнорирует ввод имени второго файла. Если же файл есть, то...

Программа игнорирует gets_s
Приветствую, проблема в функции readn, программа не дает возможности ввести название файла, откуда считывать матрицу. Из-за чего...

31
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.12.2011, 12:20
Цитата Сообщение от Glam_Man Посмотреть сообщение
gets(Note.family[count-1]);
- программа не игнорирует gets - после того как вы нажали Enter
Цитата Сообщение от Glam_Man Посмотреть сообщение
scanf("%c", &cccc);
у вас в буфере осталось сидеть '\n' от ввода - вот его то и считывает gets. чтобы попробовать решить проблему после scanf("%c", &cccc); поставьте getchar();

Добавлено через 1 минуту
Цитата Сообщение от Glam_Man Посмотреть сообщение
Проблема в том, что на 35 и 47 строках кода программа почему-то пропускает эти фрагменты кода. Вопрос: почему?
- я дал для кода ниже в тех строках ситуация аналогична - вытирайте '\n' из буфера посредством getchar();
1
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
23.12.2011, 13:31  [ТС]
-=ЮрА=-
Спасибо, помогло. Теперь нужно написать функцию чтения строк из файла формата:

21.12.2011 Ашихмин Алексей 89605123216
22.12.2011 Гусев Иван 89202561608
1.1.2011 Федотов Сергей 89151280804
...

Опишу схему присваивания на примере первой строки: 21.12.2011 должно присвоиться Note.birthday[i][0], Note.birthday[i][1] и Note.birthday[i][2] соответственно, Ашихмин в Note.family[i], Алеесей в Note.name[i] и 89605123216 в Note.phone[i], далее увеличение i до тех пор, пока оно меньше количества строк в файле. Алсо, нужно выделить память. Как это реализовывается?

Вот набросок функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void AddDataFromFile(int &count, NOTE &Note)
{
    FILE *f;
    f=fopen("database.txt", "r");
    if (f==NULL)
    {
        printf ("Файл не открывается");
        return;
    }
    else
    {
        while (!feof(f))
        {
            
        } 
        fclose(f); 
    }
}
0
23.12.2011, 13:47

Не по теме:

Не надо испльзовать gets — она небезопасна (и будет удалена в новом стандарте). Лучше вместо нее использовать fgets

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.12.2011, 13:55
Цитата Сообщение от Glam_Man Посмотреть сообщение
Теперь нужно написать функцию чтения строк из файла формата:
21.12.2011 Ашихмин Алексей 89605123216
Тип того
C
1
2
3
4
5
char sDate[32];
char sName[32];
char sFam[32];
long lVal;
fscanf(f,"%s%s%s%u",sDate,sFam,sDate,&lVal);
Добавлено через 5 минут
Glam_Man, чтобы не было граблей с gets или fgets просто напишите вместо gets(Note.family[count-1]); scanf с продвинутым спецификатором:
scanf("%[^\n]",Note.family[count-1]) - можно ввести строку с пробелами
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.12.2011, 13:59
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Glam_Man, чтобы не было граблей с gets или fgets просто напишите вместо gets(Note.family[count-1]); scanf с продвинутым спецификатором:
scanf("%[^\n]",Note.family[count-1]) - можно ввести строку с пробелами
тут такая же проблема — потенциальная опасность переполнения буфера. Чтобы от нее избавиться при использовании scanf, нужно указать maximum field width specificator в строке формата
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.12.2011, 14:04
Цитата Сообщение от Nameless One Посмотреть сообщение
тут такая же проблема — потенциальная опасность переполнения буфера. Чтобы от нее избавиться при использовании scanf, нужно указать maximum field width specificator в строке формата
- тогда
C
1
2
char text[256];
scanf("%255[^\n]",text);
просто fgets начинающие(да и я сам когда-то) воспринимают как функцию не потокового а файлового чтения...
0
 Аватар для darkknight2008
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
23.12.2011, 15:00
Цитата Сообщение от Glam_Man Посмотреть сообщение
Алсо, нужно выделить память. Как это реализовывается?
Сначало нужно пробежать весь файл сверху вниз, посчитать кол-во человек. Получим N - кол-во человек, далее выделим память.
C++
1
2
3
4
Note.birthday = new int[N][3];
Note.family = new char[N][MAX_STR]; // MAX_STR ты должен объявить сам
Note.name  = new char[N][MAX_STR];
Note.phone = new char[N][MAX_STR];
Далее возвращаем указатель в файле на начало и бежим по человекам...
C++
1
2
3
4
rewind(f);
for (int i = 0; i < N; i++)
  if (fscanf(f, "%i.%i.%i %s %s %s", &Note.birthday[i][0], &Note.birthday[i][1], &Note.birthday[i][2], Note.family[i], Note.name[i], Note.phone[i]) != 6)
    printf("Incorrect %i string in file!\n", i + 1);
Наверно чтото на подобии этого должно быть.
0
23.12.2011, 15:22

Не по теме:

darkknight2008, а считать время в строку не проще ли???

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
fscanf(f,"%s%s%s%u",sDate,sFam,sDate,&lV al);

0
23.12.2011, 15:27

Не по теме:

Цитата Сообщение от Glam_Man Посмотреть сообщение
должно присвоиться Note.birthday[i][0], Note.birthday[i][1] и Note.birthday[i][2]
Как написано, так и сделал. Д и сортировку по дате проводить будет легче.

0
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
24.12.2011, 09:56  [ТС]
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Сначало нужно пробежать весь файл сверху вниз, посчитать кол-во человек. Получим N - кол-во человек, далее выделим память.
C++
1
2
3
4
Note.birthday = new int[N][3];
Note.family = new char[N][MAX_STR]; // MAX_STR ты должен объявить сам
Note.name  = new char[N][MAX_STR];
Note.phone = new char[N][MAX_STR];
Далее возвращаем указатель в файле на начало и бежим по человекам...
Тогда такой вопрос: как посчтать количество человек в файле? Наверное надо как-то организовать цикл, который будет считать количество '\n' в файле, но я хз как
C++
1
2
3
4
rewind(f);
for (int i = 0; i < N; i++)
  if (fscanf(f, "%i.%i.%i %s %s %s", &Note.birthday[i][0], &Note.birthday[i][1], &Note.birthday[i][2], Note.family[i], Note.name[i], Note.phone[i]) != 6)
    printf("Incorrect %i string in file!\n", i + 1);
Наверно чтото на подобии этого должно быть.
rewind() что за функция?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
24.12.2011, 09:59
Установка индикатора позиции в файле на начало файла
0
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
24.12.2011, 10:31  [ТС]
C++
1
2
3
4
5
while(fgetc(f!=EOF))
{
if(fgetc(f)=='\n') 
k++;
}
Подсчитает количество строк в файле?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
24.12.2011, 10:35
Теоретически, должна была бы. Но, будет ли она работать правильно, целиком зависит от файла, т.к. на проверку приходит два считывания. Ну и проверка на конец файла совершенно неправильная.
Подсчитывать строки можно так
C
1
2
3
4
char c;
while((c = fgetc(f)) != EOF)
  if(c == '\n')
    k++;
0
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
24.12.2011, 10:58  [ТС]
Ок, дописал функцию
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
void AddDataFromFile(int &count, NOTE *Note)
{
    FILE *f;
    char cc;
    f=fopen("database.txt", "r");
    if (f==NULL)
    {
        printf ("Файл не открывается\n");
        return;
    }
    else
    {
        while((cc=fgetc(f))!=EOF)
        {
            if(cc=='\n') 
            count++;
        }
        rewind(f);
        Note[count].family = new char[500];
        Note[count].name  = new char[500];
        Note[count].phone = new char[500];
        for (int i=0; i<count; i++)
        {
            if (fscanf(f, "%i.%i.%i %s %s %s", &Note[i].birthday[0], &Note[i].birthday[1], &Note[i].birthday[2], &Note[i].family, &Note[i].name, &Note[i].phone)!=6)
            {
                printf("Некорректная %i строка в файле\n", i+1); 
            }
            fclose(f);
            return;
        }
    }
}
Но при вызове функции вылезает сообщение об обращении инструкции по адресу к памяти по адресу и о том, что память не может быть "written". В чём проблема?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
24.12.2011, 11:06
скорее всего 19-21 строки — неправильно выделяешь память
C++
1
2
3
4
5
6
for(int i = 0; i < count; ++i)
{
    Note[i].family = new char[500];
    Note[i].name  = new char[500];
    Note[i].phone = new char[500];
}
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
24.12.2011, 11:08
И да — под сам массив Note память выделена?
0
24.12.2011, 11:29

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
while((c = fgets(f)) != EOF)
может fgetc?

1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
24.12.2011, 11:29
спасибо, поправил
0
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
24.12.2011, 11:40  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
И да — под сам массив Note память выделена?
Дас
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
void AddDataFromFile(int &count, NOTE *Note)
{
    count=0;
    FILE *f;
    char cc;
    f=fopen("database.txt", "r");
    if (f==NULL)
    {
        printf ("Файл не открывается\n");
        return;
    }
    else
    {
        while((cc=fgetc(f))!=EOF)
        {
            if(cc=='\n') 
            count++;
        }
        rewind(f);
        for(int i = 0; i < count; ++i)
        {
             Note[i].family = new char[500];
             Note[i].name  = new char[500];
             Note[i].phone = new char[500];
        }
        for (int i=0; i<count; i++)
        {
            if (fscanf(f, "%i.%i.%i %s %s %s", &Note[i].birthday[0], &Note[i].birthday[1], &Note[i].birthday[2], &Note[i].family, &Note[i].name, &Note[i].phone)!=6)
            {
                printf("Некорректная %i строка в файле\n", i+1); 
            }
            fclose(f);
            return;
        }
    }
}
Поправил. Теперь проблема в том, что count подсчитывает количество строк, на 1 меньшее, чем в файле, всё из-за того, что последний символ в файле есть последний символ номера телефона последней записи. Нужно как-то сделать так, чтобы последнюю строчку count тоже сосчитал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2011, 11:40
Помогаю со студенческими работами здесь

Программа игнорирует цикл, с++
Задание Определить средний рост девочек, и мальчиков одного класса. В классе учится n учеников. Программа #include...

Программа игнорирует break
скажите кто нибудь почему программа игнорирует break'и? #include &lt;iostream.h&gt; int menu(); int main() { int choice=menu(); ...

Программа игнорирует пробел.
Мне нужно написать такую программу: Заменить всюду в файле один заданный набор символов на другой(с учётом разницы в их длине). ...

Почему-то программа игнорирует условие if/else
Дана задача: Даны два массива: А и B (M и N вводятся с клавиатуры). Необходимо создать третий массив минимально возможного размера, в...

Не работает gets (программа игнорирует операцию ввода)
Помогите. Не работает оператор gets в моей программе! Что делать? Как изменить? Все идет нормально, никаких ошибок. Но когда доходит дело...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru