C++ | Проблемы с getline

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <conio.h>

#include <string>
#include <math.h>
#include <locale.h>

using namespace std;


typedef struct {
    string name;
    char number[15];
    int birth[3];
} note;

int main()
{
    setlocale(LC_ALL, "");
    note* test;
    int n;
    char trash;
    cout << "Введите количество юзеров: ";
    cin >> n;
    test = (note*)calloc(n, sizeof(note));
    for (int i = 0; i < n; i++) {
        cout << "Введите фамилию ";
        cin.ignore();
        getline(cin, test[i].name); // При вводе, например, Kozlov, считывает как "pozlov" или "?ozlov"; 
        cout << "Введите номер телефона: ";
        cin >> test[i].number;
        while(test[i].number[0] == '+'){
            cout << "Введите номер телефона БЕЗ плюса: ";
            cin >> test[i].number;
        }
        cout << "Введите дату рождения(dd.mm.yyyy): ";
        cin >> test[i].birth[0] >> trash >> test[i].birth[1] >> trash >> test[i].birth[2];
        while (test[i].birth[0] > 31 || test[i].birth[0] < 1 || test[i].birth[1] > 12 || test[i].birth[1] < 1 || test[i].birth[2] > 9999 || test[i].birth[2] < 1000) {
            cout << "[!]Формат ввода: DD.MM.YYYY(например: 12.07.2001)";
            cout << "Введите дату рождения(dd.mm.yyyy): ";
            cin >> test[i].birth[0] >> trash >> test[i].birth[1] >> trash >> test[i].birth[2];
        }
    }
    int on;
    cout << "По какому полю искать" << endl;
    cout << "1 - ФИО; 2 - НОМЕР ТЕЛЕФОНА; 3 - ДР: " << endl;
    cin >> on;
    string search;
    int searchh[3];

    if (on == 1) {
        cout << "Введите имя, фамилию, отчество: ";
        while (getchar() != '\n');
        getline(cin, search);
        for (int i = 0; i < n; i++) {
            if (search != test[i].name) {
                cout << "Фамилия: " << test[i].name << endl;
                cout << "Номер: " << test[i].number << endl;
                cout << "ДР: " << test[i].birth << endl;
            }
        }
    }

    if (on == 2) {
        cout << "Введите номер: ";
        cin >> search;
         while(search[0] == '+'){
            cout << "Введите номер телефона БЕЗ плюса: ";
            cin >> search;
        }
        for (int i = 0; i < n; i++) {
            //if ((strcmp(search, test[i].number)) == 0) {
            if (search == test[i].number) {
                cout << "Фамилия: " << test[i].name << endl;
                cout << "Номер: " << test[i].number << endl;
                cout << "ДР: " << test[i].birth << endl;
            }
        }
    }

    if (on == 3) {
        cout << "Введите дату рождения(dd.mm.yyyy): ";
        cin >> searchh[0] >> trash >> searchh[1] >> trash >> searchh[2];
        while (searchh[0] > 31 || searchh[0] < 1 || searchh[1] > 12 || searchh[1] < 1 || searchh[2] > 9999 || searchh[2] < 1000) {
            cout << "[!]Формат ввода: DD.MM.YYYY(например: 12.07.2001)";
            cout << "Введите дату рождения(dd.mm.yyyy): ";
            cin >> searchh[0] >> trash >> searchh[1] >> trash >> searchh[2];
        }
        for (int i = 0; i < n; i++) {
            if (searchh[0] == test[i].birth[0] && searchh[1] == test[i].birth[1] && searchh[2] == test[i].birth[2]) {
                cout << "ФИО: " << test[i].name << endl;
                cout << "Номер: " << test[i].number << endl;
                cout << "ДР: " << test[i].birth << endl;
            }
        }
    }
}

Какие-то проблемы с getline при вводе, например, Kozlov, считывает как "pozlov" или "?ozlov";


Ответы (1 шт):

Автор решения: Harry

Это вам не C, ваша конструкция

 test = (note*)calloc(n, sizeof(note));

выделила память, но это не значит, что теперь test[i].name является корректной строкой - конструктор для нее вызван не был. У вас получается нечто неопределенное, точнее - неопределенное поведение. И вам не повезло - увы, программа не рухнула сразу, а начала работать неверно.

В C++ вы должны использовать оператор new, который не только выделяет память, но еще и делает много других нужных вещей - в частности, вызывает конструктор.

test = new note;

А вообще-то странная смесь C и С++ не только в этом, но и в самой структуре - тут и строка string, и массив char[]...

→ Ссылка