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

первый gets() игнорируется, а второй работает - C++

Восстановить пароль Регистрация
 
Петр1
 Аватар для Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
25.10.2012, 14:41     первый gets() игнорируется, а второй работает #1
Здравствуйте!
Не могу понять почему первый gets() игнорируется, вернее в него записывается '\n';

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
#include<iostream>
#include<stdio.h>
#include<string.h>
 
using namespace std;
 
struct person
{
    char *surname; 
    char *name; 
    int day;
};
 
void main(){
    int n=2;
    person **ar=new person*[n];
    for(int i=0; i<n; i++){
        ar[i] =new person [40];
    }
    ar[0][0].surname=new char[40];
    ar[0][0].surname[40] ='\0';
    ar[0][0].name=new char[40];
    ar[0][0].name[40] ='\0';
    cin>>ar[0][0].day;
    cin>>ar[0][1].day;
 
    for(int i=0; i<1; i++){
        for(int j=0; j<1; j++){
            cout<<"sur - ";
            gets(ar[i][j].surname);
            cout<<"nam - ";
            gets(ar[i][j].name);
        }
    }
    for(int i=0; i<1; i++){
        for(int j=0; j<1; j++){
            cout<<ar[i][j].surname<<" "<<ar[i][j].name<<" "<<ar[i][j].day<<" "<<ar[i][j+1].day<<endl;
        }
    }   cout<<endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 14:41     первый gets() игнорируется, а второй работает
Посмотрите здесь:

Сравнить первый и второй элементы массива C++
Выяснить, имеются ли во введенной строке соседние символы, первый из которых – ‘f’, а второй – ‘ ; ‘. C++
Преобразовать строку, заменив в ней первый символ на второй. C++
GetPixel, почему первый иф равен тру, а второй - нет C++
C++ Из массива положительные элементы перетащить в первый массив, а все отрицательные во второй.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
25.10.2012, 15:32     первый gets() игнорируется, а второй работает #2
C++
1
2
3
4
5
6
7
8
...
cin>>ar[0][0].day;
cin>>ar[0][1].day;
...
gets(ar[i][j].surname);
...
gets(ar[i][j].name);
...
Первый cin пропускает все симолы пробела и начала новой строки и читает ar[0][0].day. При этом символ начала новой строки остается во входном потоке... Его пропускает второй cin. Но после ввода ar[0][1].day опять этот символ остается во входном потоке. И его зибирает gets...
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
25.10.2012, 16:05     первый gets() игнорируется, а второй работает #3
после ввода через cin >> в потоке остается '\n', он у вас и попадает в gets
и вообще не стоит использовать gets и уж темболее мешать код си и си++
Петр1
 Аватар для Петр1
3 / 1 / 1
Регистрация: 09.10.2012
Сообщений: 25
25.10.2012, 17:05  [ТС]     первый gets() игнорируется, а второй работает #4
а как тогда записать day (type int)
или как тогда записывать surname? через cin>>?
gets() мне кажется удобно, может только кажется?
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
25.10.2012, 19:03     первый gets() игнорируется, а второй работает #5
Метод cin возвращает ссылку на поток, потому можно использовать конструкцию (cin>>...).get();
в этом случае get() заберет символ новой строки...
Можно сигнорить весь поток, пока не встретится символ перевода строки
istream& ignore ( streamsize n = 1, int delim = EOF );
Пропускает n-символов или пока не встретится delim.

Добавлено через 1 минуту
cin.ignore(256,'\n');

Добавлено через 16 минут
аа.. кстати, если будет интересно, можешь почитать у Стивена Прата "Язык программирования с++. Лекции и упражнения" на стр. 85 Строчно ориентированный ввод...
Yandex
Объявления
25.10.2012, 19:03     первый gets() игнорируется, а второй работает
Ответ Создать тему
Опции темы

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