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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tarkys
0 / 0 / 0
Регистрация: 22.02.2013
Сообщений: 6
#1

cin.getline() - C++

22.02.2013, 20:44. Просмотров 720. Ответов 3
Метки нет (Все метки)

Вопрос заключается в следующем, собственно программа отказывается выполнять 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 20:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос cin.getline() (C++):

Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода - C++
Почему в моем случае getline(cin, m) не срабатывает без cin.ignore() ? Если по коду есть какие-нибудь замечания, то просьба написать что не...

Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами - C++
Нужна помощь. Задача продемонстрировать различие между вводом с помощью cin.get и cin.getline с тремя параметрами, как из потока достать...

Отличие функции cin.get и cin.getline - C++
Добрый день! Изучаю функции get и getline, сказано, что они отличаются тем, что функция get считывает символ разрыва строк и оставляет...

Отличие getline() от cin.getline() - C++
Чем отличается getline() от cin.getline() ?

cin.getline и cin.ignore - C++
Есть кусок кода в котором не могу разобраться. Если cin.ignore() есть, то теряется первый вводимый символ начиная со второго входа в for....

getline(cin, str) и cin>> - C++
Добрый день. Есть код: ... string str; int N; cin&gt;&gt; N; getline(cin, str); cout&lt;&lt;str&lt;&lt;endl; //Выводит: &lt;пустота&gt; ...

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

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

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

Cin вместо cin.getline - C++
#include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;fstream&gt; using namespace std; int get_int(int default_value); char name; ...

Не работает ни cin.Get(), ни cin.Getline() - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;windows.h&quot; #include &quot;string.h&quot; using namespace::std; const...

Getline() и cin - C++
Проблема заключается в том, что после ввода через cin , getline() не работает, точнее работает, но непонятно для меня. Я так предполагаю,...

cin И getline - C++
#include &lt;iostream&gt; int main() { using namespace std; char n1; int n2;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru