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

Почему склеиваются две строки, которые просто последовательно считываются - C++

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
06.12.2015, 09:59     Почему склеиваются две строки, которые просто последовательно считываются #1
В функции ReadEmployee склеиваются date и married. Но там же нет никакой конкатенации... Как это исправить?
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
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
struct Employee
{
    int number;
    char firstname[20], secondname[20],
        date[10],
        married[50],
        position[50];
    int year;
};
 
void PrintEmployee(Employee emp)
{
    cout << "Номер записи: " << emp.number << endl
        << "Фамилия: " << emp.secondname << endl
        << "Имя: " << emp.firstname << endl
        << "Должность: " << emp.position << endl
        << "Год поступления на должность: " << emp.year << endl
        << "Стаж: " << 2015 - emp.year << endl
        << "Дата рождения: " << emp.date << endl
        << "Семейное положение: " << emp.married << endl << endl;
}
 
Employee ReadEmployee()
{
    cout << "Зашли в Read...\n";
    Employee newemp;
    cout << "Введите № записи: ";
    cin >> newemp.number;
    fflush(stdin);
    cout << "Введите имя: ";
    gets(newemp.firstname);
    cout << "Введите фамилию: ";
    gets(newemp.secondname);
    cout << "Дата рождения: ";
    fflush(stdin);
    gets(newemp.date);
    cout << "Семейное положение: ";
    fflush(stdin);
    gets(newemp.married);
    cout << "Должность: ";
    gets(newemp.position);
    cout << "Год поступления на должность: ";
    cin >> newemp.year;
    cout << endl;
    PrintEmployee(newemp);
    return newemp;
}
 
void Add(Employee a[], int &n)
{
    Employee newemp = ReadEmployee();
    cout << "Зашли в Add...\n";
    PrintEmployee(newemp);
    for (int i = 0; i < n; i++)
        if (strcmp(newemp.secondname, a[i].secondname) <= 0)
        {
            for (int j = n; j > i; j--)
                a[j] = a[j - 1];
            a[i] = newemp;
            break;
        }
    n++;
}
 
void Print(Employee a[], int n)
{
    for (int i = 0; i < n; i++)
        PrintEmployee(a[i]);
}
 
void Edit(Employee a[], int n)
{
    int number, pos;
    cout << "Введите номер записи: ";
    cin >> number;
    for (pos = 0; pos < n && a[pos].number != number; pos++);
    if (pos == n)
        cout << "Запись с указанным номером не найдена!\n";
    else
    {
        a[pos] = ReadEmployee();
        cout << "Запись успешно изменена!\n";
    }
}
 
void Delete(Employee a[], int &n)
{
    int number, pos;
    cout << "Введите номер записи: ";
    cin >> number;
    for (pos = 0; pos < n && a[pos].number != number; pos++);
    if (pos == n)
        cout << "Запись с указанным номером не найдена!\n";
    else
    {
        for (int i = pos; i < n - 1; i++)
            a[i] = a[i + 1];
        n--;
        cout << "Запись успешно удалена!\n";
    }
}
 
void SearchBySecondname(Employee a[], int n)
{
    char secondname[20];
    cout << "Введите фамилию: ";
    fflush(stdin);
    gets(secondname);
    for (int i = 0; i < n; i++)
        if (strcmp(a[i].secondname, secondname) == 0)
        {
            PrintEmployee(a[i]);
            break;
        }
}
 
void SearchByPos(Employee a[], int n)
{
    char word[20];
    cout << "Введите ключевое слово: ";
    fflush(stdin);
    gets(word);
    for (int i = 0; i < n; i++)
        if (strstr(a[i].position, word) != NULL)
            PrintEmployee(a[i]);
}
 
int Menu()
{
    int choice;
    system("cls");
    cout << "1 - Вывод списка сотрудников на экран\n"
        << "2 - Добавление новой записи\n"
        << "3 - Редактирование записи с указанным номером\n"
        << "4 - Удаление записи с указанным номером\n"
        << "5 - Поиск записи по фамилии\n"
        << "6 - Поиск записи по ключевому слову в должности\n"
        << "0 - Выход из программы\n"
        << "Ваш выбор: ";
    cin >> choice;
    cout << endl;
    return choice;
}
 
int main()
{
    Employee info[500];
    int N = 0, n;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Введите количество сотрудников: ";
    cin >> n;
    for (int i = 0; i < n; i++)
        Add(info, N);
 
    while (true)
    {
        switch (Menu())
        {
        case 0:
            return 0;
        case 1:
            Print(info, N);
            break;
        case 2:
            Add(info, N);
            break;
        case 3:
            Edit(info, n);
            break;
        case 4:
            Delete(info, n);
            break;
        case 5:
            SearchBySecondname(info, n);
            break;
        case 6:
            SearchByPos(info, n);
            break;
        }
        system("pause");
    }
}
Миниатюры
Почему склеиваются две строки, которые просто последовательно считываются  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2015, 09:59     Почему склеиваются две строки, которые просто последовательно считываются
Посмотрите здесь:

C++ легко и просто) про строки
вывести из строки те слова ,которые содержат две буквы z. C++
C++ Подскажите, почему для каждого объекта в программе выдает две ошибки
C++ Даны две строки, сформировать третью из символов, которые встречаются более двух раз
Почему в этой программе (n+2) и [m+2] а не просто n и m? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4268 / 3699 / 1245
Регистрация: 14.04.2014
Сообщений: 14,485
06.12.2015, 10:16     Почему склеиваются две строки, которые просто последовательно считываются #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Потому что для date мало 10 элементов, больше делай. И что это за смесь iostream с древними функциями? gets() вообще не входит в стандарт. Есть же cin.getline().
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,159
Завершенные тесты: 1
06.12.2015, 10:17     Почему склеиваются две строки, которые просто последовательно считываются #3
У меня (VS 2008) не склеиваются, но функция Add неправильная.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Add(Employee a[], int &n)
{
    Employee newemp = ReadEmployee();
    cout << "Зашли в Add...\n";
    PrintEmployee(newemp);
    a[n++] = newemp; // добавил эту строку
    /*
    for (int i = 0; i < n; i++)
        if (strcmp(newemp.secondname, a[i].secondname) <= 0)
        {
            for (int j = n; j > i; j--)
                a[j] = a[j - 1];
            a[i] = newemp;
            break;
        }
    n++;
    */
}
И, естественно, поддерживаю nmcf. Не надо смешивать Сишные и потоковые функции ввода.
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
06.12.2015, 12:12  [ТС]     Почему склеиваются две строки, которые просто последовательно считываются #4
zss, понятно - в начале цикл-то не выполнялся ни разу... А почему в таком варианте происходит Access violation?
C++
1
2
3
4
5
6
7
8
9
10
11
void Add(Employee a[], int &n)
{
    Employee newemp = ReadEmployee();
    int pos = 0;
    while (strcmp(newemp.secondname, a[pos].secondname) > 0)
        pos++;
    for (int i = n; i > pos; i--)
        a[i] = a[i - 1];
    a[pos] = newemp;
    n++;
}
Добавлено через 1 час 36 минут
мды, забыла про количество элементов))
Yandex
Объявления
06.12.2015, 12:12     Почему склеиваются две строки, которые просто последовательно считываются
Ответ Создать тему
Опции темы

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