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

cin.getline() - C++

Восстановить пароль Регистрация
 
tarkys
0 / 0 / 0
Регистрация: 22.02.2013
Сообщений: 6
22.02.2013, 20:44     cin.getline() #1
Вопрос заключается в следующем, собственно программа отказывается выполнять cin.getline(... , ...); (... - аргументы) в начале своей функции, если не написть эту строку дважды, грубо говоря он игнорит первый син.гетлайн(). Я был бы благодарен за решение этой проблемки xD
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
#include<iostream>
 
using namespace std;
 
struct phonebook{
        char Name[11];
        char Surname[21];
        char Phone [13];
    };
    phonebook mas[20];
 
int add(void)
{
    char Phone [13];
    char Name [11];
    char Surname [21];
    cout<<"Enter Name"<<endl;
    cin.getline(Name,11);// собственно вот
    cin.getline(Name,11);
    cout<<"Enter Surname"<<endl;
    cin.getline(Surname,20);
    cout<<"Enter Phone"<<endl;
    cin.getline(Phone,13);
    for(int i=0; i<strlen(Phone); i++)
        if(isdigit(Phone[i])==0)
            return 1;
    for(int i=0; i<20; i++)
    {
        if(mas[i].Phone[0]==0)
        {
            strcpy(mas[i].Phone,Phone);
            strcpy(mas[i].Name,Name);
            strcpy(mas[i].Surname,Surname);
            return 0;
        }
    }
    return 1;
}
 
int del(void)
{
    cout<<"Enter Phone Number"<<endl;
    char temp[13];
    cin.getline(temp,13);//та же фигня
    cin.getline(temp,13);
    for(int i=0;i<20;i++)
    {
        if(strcmp(temp,mas[i].Phone)==0)
        {
            strcpy(mas[i].Name,"none");
            strcpy(mas[i].Phone,"none");
            strcpy(mas[i].Surname,"none");
            cout<<"done"<<endl;
        }
        return 0;
    }
    return 1;
}
 
int search(void)
{
    cout<<"Enter Phone Number"<<endl;
    char temp[13];
    cin.getline(temp,13);// и опять
    cin.getline(temp,13);
    for(int i=0;i<20;i++)
    {
        if(strcmp(temp,mas[i].Phone)==0)
        {
            cout<<mas[i].Phone<<" "<<mas[i].Name<<" "<<mas[i].Surname<<endl;
        }
    }
    return 1;
}
 
int output(void)
{
    //cout<<"Name\tSurname\t\tPhone\n";
    for(int i=0; i<20; i++)
    {
        cout<<mas[i].Name<<"\t"<<mas[i].Surname<<"\t"<<mas[i].Phone<<endl;
    }
    return 1;
}
 
int menu (void)
{
    m1:cout<<"1-ADD\n2-DEL\n3-SEARCH\n4-SHOW\n5-EXIT"<<endl;
    cout<<"Input Field ";
    char mn;
    cin.sync();
    cin.clear();
    cin>>mn;
    switch(mn)
    {
    case '1': 
        system("cls");
        add();
        goto m1;
        break;
    case '2':
        system("cls");
        del();
        goto m1;
        break;
    case '3':
        system("cls");
        search();
        goto m1;
        break;
    case '4':
        system("cls");
        output();
        goto m1;
    case '5':
        return 0;
        break;
    default:
        system("cls");
        cout<<"Your IQ below 60, plz try again"<<endl;
        goto m1;
    }
}
 
int main()
{
    do
    {
        //char e[6];
        char e;
        bool f=false;
        system("cls");
        cout<<"type <<q>> to exit, any another input charecter"/*or character set*/" = enter menu"<<endl;
        cin.sync();
        cin.clear();
        //cin.getline(e,5);
        cin>>e;
        //if(strcmp(e,"exit")==0)
        if(e=='q')
            return 0;   
        else
        {
            system("cls");
            menu();
            f=true;
        }
    }while(true);
    cin.get();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 20:44     cin.getline()
Посмотрите здесь:

C++ cin.getline
getline(cin, str) и cin>> C++
C++ Отличие функции cin.get и cin.getline
cin.getline и cin.ignore C++
C++ Cin вместо cin.getline
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 21:07     cin.getline() #2
После cin >> в меню, в потоке остаётся '\n'(попадает туда после нажатия Enter). Перед getline() его нужно убрать из потока, иначе getline() обработает его как пустую строку. Как вариант, перед getline() (или после cin >>) написать: cin.get();

Добавлено через 2 минуты
Ещё можно так использовать cin: (cin >> mn).get(); После этого в потоке '\n' не будет.
tarkys
0 / 0 / 0
Регистрация: 22.02.2013
Сообщений: 6
23.02.2013, 15:45  [ТС]     cin.getline() #3
Спасибо! xD

Добавлено через 18 часов 32 минуты
Найдено более рациональное решение, грубо говоря очистка всего буфера потока, а не одного символа(в случае с cin.get()), так как мало ли что юзер введет с клавиатуры.
C++
1
2
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.02.2013, 16:30     cin.getline() #4
Я бы дал этому другое название. Это не более рациональное решение для удаления одного символа из потока, а более продуманный код. Для этого случая мне больше нравится такое решение:
C++
1
2
cin.clear();
while (cin.get() != '\n');
И если идти дальше, в направлении продуманности кода, то нужно организовать в меню циклы, исключающие неверный ввод.
Yandex
Объявления
23.02.2013, 16:30     cin.getline()
Ответ Создать тему
Опции темы

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