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 шт):
Это вам не C, ваша конструкция
test = (note*)calloc(n, sizeof(note));
выделила память, но это не значит, что теперь test[i].name является корректной строкой - конструктор для нее вызван не был. У вас получается нечто неопределенное, точнее - неопределенное поведение. И вам не повезло - увы, программа не рухнула сразу, а начала работать неверно.
В C++ вы должны использовать оператор new, который не только выделяет память, но еще и делает много других нужных вещей - в частности, вызывает конструктор.
test = new note;
А вообще-то странная смесь C и С++ не только в этом, но и в самой структуре - тут и строка string, и массив char[]...