Ошибка в коде, с++ - Вопросы по С+

Вопрос Ошибка в коде, с++

Регистрация
18 Ноя 2013
Сообщения
85
Репутация
0
Спасибо
0
Монет
0
#include
using namespace std;

struct books {
char author[15];
char title[15];
char publ[10];
char g[10];

};

void input(books *M, int N) {
for (int i = 0; i < N; i++) {
cout << "Автор: ";
cin.getline(M.author, 15);
cout << "Название книги: ";
cin.getline(M.title, 15);
cout << "Издательство: ";
cin.getline(M.publ, 15);
cout << "Жанр: ";
cin.getline(M.g, 10);

}

}

void show(books *M, int N) {
for (int i = 0; i < N; i++) {
cout << M.author << endl;
cout << M.title << endl;
cout << M.publ << endl;
cout << M.g << endl;
}

}

int main(){
setlocale(0, "");
int N;
cout << "Введите N" << endl;
cin >> N;

books *M = new books[N];
input(M, N);
//show(M, N);

delete[]M;
system("pause");
return 0;
}

Сам компилятор ошибки не выдает, но почему то программа не корректно получает данные от пользователя (почти полностью игнорирует вот эти строки:
cout << "Автор: ";
cin.getline(M.author, 15);)
 
Регистрация
20 Окт 2013
Сообщения
81
Репутация
21
Спасибо
1
Монет
0
Метод getline считывает символы из потока и присваивает их строке. Если поток пуст - просит ввести. После ввода значения переменной N, в потоке остался символ ввода. Этот символ считывается getline и присваивается строке. Поэтому, ввод первой строки после ввода значения переменной "игнорируется". Чтобы этого не было - необходимо проигнорировать символ ввода в потоке. Это можно сделать с помощью метода ignore объекта cin. Добавьте его после ввода переменной.
 
Регистрация
23 Май 2013
Сообщения
62
Репутация
0
Спасибо
0
Монет
0
Одна из бяк -- сравни цифирь " char publ[10]; ... cin.getline(M.publ, 15); " ---- и учитывай, что в строке из char надо завершающий символ с кодом 0, так что стоит резервировать на единичку места больше
 
Регистрация
13 Мар 2017
Сообщения
314
Репутация
70
Спасибо
11
Монет
0
#include
using namespace std;

struct books {
char author[15];
char title[15];
char publ[10];
char g[10];

};

void input(books *M, int N) {
for (int i = 0; i < N; i++) {
cout << "Автор: ";
cin.getline(M.author, 15);
cout << "Название книги: ";
cin.getline(M.title, 15);
cout << "Издательство: ";
cin.getline(M.publ, 15);
cout << "Жанр: ";
cin.getline(M.g, 10);

}

}

void show(books *M, int N) {
for (int i = 0; i < N; i++) {
cout << M.author << endl;
cout << M.title << endl;
cout << M.publ << endl;
cout << M.g << endl;
}

}

int main(){
setlocale(0, "");
int N;
cout << "Введите N" << endl;
cin >> N;

books *M = new books[N];
input(M, N);
//show(M, N);

delete[]M;
system("pause");
return 0;
}

Сам компилятор ошибки не выдает, но почему то программа не корректно получает данные от пользователя (почти полностью игнорирует вот эти строки:
cout << "Автор: ";
cin.getline(M.author, 15);)

При такой структуре даже с cin.ignore() будет возникать такая проблема во всех итерация кроме нулевой, можно реализовать данную задачу иначе, проще и без ошибок.

[THIDE="0"]#include <iostream>
#include <cstring>
#include <stdio.h>
#include <conio.h>
using namespace std;
typedef struct
{
char author[40];
char title[40];
char publ[40];
char g[40];
} kniga;
int main()
{
int n;
kniga kniga[2];
printf("How many books?\n");
cin>>n;
int i;
for (i = 0; i < n; i++)
{
printf("Book # %d :\n", i + 1);
printf("Writer:\n");
fflush(stdin);
gets(kniga.author);
printf("Title:\n");
gets(kniga.title);
printf("Publication:\n");
gets(kniga.publ);
printf("Genre:\n");
gets(kniga.g);
}
for (int i = 0; i < n; i++) {
printf("Info about Book # %d :\n", i + 1);
cout <<"Writer: " << kniga.author <<endl;
cout <<"Title: " << kniga.title <<endl;
cout <<"Publication: " << kniga.publ <<endl;
cout <<"Genre: " << kniga.g <<endl;
}
getch();
return 0;
}
[/THIDE]
 
Последнее редактирование:
Сверху Снизу