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

Не производиться ввод при помощи функции gets(s) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
30.10.2012, 20:00     Не производиться ввод при помощи функции gets(s) #1
По непонятной мне причине не производиться ввод при помощи функции gets(s) или getline(cin, s). Если использовать просто cin, то проблем нет:
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
//Рекурсия. Вычисление факториала. Функция, возвращающая
// наибольший общий делитель. Функция возращающая строку в обратном
// порядке.
 
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
 
// Функция вычисления факториала
int factorial( int val );
// Функция возвращает наибольший обший делитель
int rgcd( int v1, int v2 );
// Функция отображающая строку в обратном порядке
void reverse(char *s);
 
int main()
{
    // Применение функции вычисления факториала
    cout << "<Применение функции вычисления факториала>" << endl;
    cout << "Введите значение: ";
    int some_val;
    cin >> some_val;
    cout << factorial(some_val) << endl;
 
    // Применение функции возвращающей напибольший общий делитель
    cout << "<Применение функции возвращающей наибольший общий делитель>" << endl;
    cout << "Введите 2 значения: ";
    int dig1 = 0, dig2 = 0;
    cin >> dig1 >> dig2;
    cout << rgcd(dig1, dig2) << endl;
 
    cout << "<Применение функции отобращающе строку в обратном порядке>" << endl;
    cout << "Введите строку: ";
    char a[80];
    gets(a); // ВОТ НА ЭТОМ МЕСТЕ ПРОГРАММА ЗАВЕРШАЕТСЯ!
    reverse(a);
    return EXIT_SUCCESS;
}
 
// Функция отображающая строку в обратном порядке
void reverse(char *s)
{
    if (*s)
    reverse(s + 1);
    else
    return;
    cout << *s;
}
 
// Функция вычисления факториала
int factorial( int val )
{
    if ( val > 1 )
    return factorial(val - 1) * val;
    return 1;
}
 
// Функция возвращает наибольший обший делитель
int rgcd( int v1, int v2 )
{
    if ( v2 != 0 ) 
    return  rgcd(v2, v1 % v2);
    return v1;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.10.2012, 20:48     Не производиться ввод при помощи функции gets(s) #2
после ввода 2 значений поставь строку
cin.sync();
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
30.10.2012, 23:01  [ТС]     Не производиться ввод при помощи функции gets(s) #3
А с чем это связано, можете разьяснить пожалуйста
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.10.2012, 23:06     Не производиться ввод при помощи функции gets(s) #4
cin.sync() убирает мусор из потока. У тебя после ввода в потоке остаётся символ '\n' перехода на новую строку, вот и всё.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
30.10.2012, 23:29  [ТС]     Не производиться ввод при помощи функции gets(s) #5
раньше такого "глюка" не встричал. Чем дальше тем интересней...

Добавлено через 10 минут
Рановато я вам поставил лайки... Рекомендация данная вами ожидаемого результата не дала.
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.10.2012, 23:33     Не производиться ввод при помощи функции gets(s) #6
я тебе поправил, как надо
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
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
 
// Функция вычисления факториала
int factorial( int val );
// Функция возвращает наибольший обший делитель
int rgcd( int v1, int v2 );
// Функция отображающая строку в обратном порядке
void reverse(char *s);
 
int main()
{
    // Применение функции вычисления факториала
    cout << "<Применение функции вычисления факториала>" << endl;
    cout << "Введите значение: ";
    int some_val;
    cin >> some_val;
    cout << factorial(some_val) << endl;
 
    // Применение функции возвращающей напибольший общий делитель
    cout << "<Применение функции возвращающей наибольший общий делитель>" << endl;
    cout << "Введите 2 значения: ";
    int dig1 = 0, dig2 = 0;
    cin >> dig1 >> dig2;
    cout << rgcd(dig1, dig2) << endl; 
    cin.sync();
 
    cout << "<Применение функции отобращающе строку в обратном порядке>" << endl;
    cout << "Введите строку: ";
    char a[80];
    cin.getline(a, 80);
    reverse(a);
    return EXIT_SUCCESS;
}
 
// Функция отображающая строку в обратном порядке
void reverse(char *s)
{
    if (*s)
    reverse(s + 1);
    else
    return;
    cout << *s;
}
 
// Функция вычисления факториала
int factorial( int val )
{
    if ( val > 1 )
    return factorial(val - 1) * val;
    return 1;
}
 
// Функция возвращает наибольший обший делитель
int rgcd( int v1, int v2 )
{
    if ( v2 != 0 ) 
    return  rgcd(v2, v1 % v2);
    return v1;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
30.10.2012, 23:48  [ТС]     Не производиться ввод при помощи функции gets(s) #7
(gdb) run
Starting program: /media/win_d/Helloworld/currents/algo6-recursion
<Применение функции вычисления факториала>
Введите значение: 3
6
<Применение функции возвращающей наибольший общий делитель>
Введите 2 значения: 5
2
1
<Применение функции отобращающе строку в обратном порядке>
Введите строку: [Inferior 1 (process 3784) exited normally]
(gdb)
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.10.2012, 23:54     Не производиться ввод при помощи функции gets(s) #8
Незнаю, что тебе сказать проверил на двух компиляторах у меня всё работает нормально.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
31.10.2012, 00:00     Не производиться ввод при помощи функции gets(s) #9
Одного cin.sync не достаточно. Сделайте так:
C++
1
2
cin.clear();
cin.sync();
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
31.10.2012, 00:12  [ТС]     Не производиться ввод при помощи функции gets(s) #10
Пробовал и при помощи gets(), результат аналогичен. Также проблема не в отладчиле:
ilyuha21st@coldshoot:/media/win_d/Helloworld/currents$ ./algo6-recursion
<Применение функции вычисления факториала>
Введите значение: 3
6
<Применение функции возвращающей наибольший общий делитель>
Введите 2 значения: 3 5
1
<Применение функции отобращающе строку в обратном порядке>
Введите строку: ilyuha21st@coldshoot:/media/win_d/Helloworld/currents$

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Одного cin.sync не достаточно. Сделайте так:
Код C++
1
2
cin.clear();
cin.sync();
Все дороги ведут в Рим.

Добавлено через 6 минут
Друзья-товарищи! Все кто обладает компилятором:
Bash
1
2
ii  gcc                         4:4.6.3-1ubuntu5            GNU C compiler
ii  g++                         4:4.6.3-1ubuntu5            GNU C++ compiler
большая просьба проверить следующий код:
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
// Рекурсия. Вычисление факториала. Функция, возвращающая
// наибольший общий делитель. Функция возращающая строку в обратном
// порядке.
 
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
 
// Функция вычисления факториала
int factorial( int val );
// Функция возвращает наибольший обший делитель
int rgcd( int v1, int v2 );
// Функция отображающая строку в обратном порядке
void reverse(char *s);
 
int main()
{
    // Применение функции вычисления факториала
    cout << "<Применение функции вычисления факториала>" << endl;
    cout << "Введите значение: ";
    int some_val;
    cin >> some_val;
    
    cout << factorial(some_val) << endl;
 
    // Применение функции возвращающей напибольший общий делитель
    cout << "<Применение функции возвращающей наибольший общий делитель>" << endl;
    cout << "Введите 2 значения: ";
    int dig1 = 0, dig2 = 0;
    cin >> dig1 >> dig2;
    cout << rgcd(dig1, dig2) << endl;
 
    cout << "<Применение функции отобращающе строку в обратном порядке>" << endl;
    cout << "Введите строку: ";
    char a[80];
    cin.clear();
    cin.sync();
    cin.getline(a, 80);
    //    gets(a); // ВОТ НА ЭТОМ МЕСТЕ ПРОГРАММА ЗАВЕРШАЕТСЯ!
    reverse(a);
    return EXIT_SUCCESS;
}
 
// Функция отображающая строку в обратном порядке
void reverse(char *s)
{
    if (*s)
    reverse(s + 1);
    else
    return;
    cout << *s;
}
 
// Функция вычисления факториала
int factorial( int val )
{
    if ( val > 1 )
    return factorial(val - 1) * val;
    return 1;
}
 
// Функция возвращает наибольший обший делитель
int rgcd( int v1, int v2 )
{
    if ( v2 != 0 ) 
    return  rgcd(v2, v1 % v2);
    return v1;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
31.10.2012, 00:14     Не производиться ввод при помощи функции gets(s) #11
C++
1
2
3
4
5
6
7
    cout << "Введите строку: ";
    cin.clear();
    cin.sync();
     char a[80]={0};
     cin.get(a,'\n');
     strrev(a);
     cout<<a;
Так работает во всяком случае на VS
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2012, 00:42     Не производиться ввод при помощи функции gets(s) #12
xtorne21st, ОС какая?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
31.10.2012, 00:47  [ТС]     Не производиться ввод при помощи функции gets(s) #13
К сожалению, без результата. Мне всё таки хочется верить, что дело в нюансе стандарта; не в компиляторе же баг...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2012, 00:48     Не производиться ввод при помощи функции gets(s) #14
Croessmah, если у ТС линукс, то там cin.sync() не работает.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
31.10.2012, 00:48  [ТС]     Не производиться ввод при помощи функции gets(s) #15
Цитата Сообщение от alsav22 Посмотреть сообщение
xtorne21st, ОС какая?
Bash
1
2
3
ilyuha21st@coldshoot:/media/win_d/Helloworld/currents$ uname -a
Linux coldshoot 3.2.0-33-generic-pae #52-Ubuntu SMP Thu Oct 18 16:39:21 UTC 2012 i686 i686 i386 GNU/Linux
ilyuha21st@coldshoot:/media/win_d/Helloworld/currents$
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2012, 00:49     Не производиться ввод при помощи функции gets(s) #16
Сделайтей ввод просто так:
C++
1
2
(cin >> dig1).get();
(cin >> dig2).get();
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
31.10.2012, 00:50  [ТС]     Не производиться ввод при помощи функции gets(s) #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Croessmah, если у ТС линукс, то там cin.sync() не работает.
Да, linux
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2012, 00:54     Не производиться ввод при помощи функции gets(s) #18
Понял, что линукс.

Добавлено через 3 минуты
Или такую конструкцию:
C++
1
2
3
4
5
6
...
cout << "Введите строку: ";
cin.clear();
while (cin.get() != '\n');
char a[80]={0};
...
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
31.10.2012, 01:02  [ТС]     Не производиться ввод при помощи функции gets(s) #19
Теперь заработало. Но у меня всё таки есть вопрос: "Есть ли функция подобная cin.sync() и если нет, то как можно решить данный вопрос?" Не прописывать же всегда (cin >> dig2).get(); которая, как работает, пока для меня загадка...
Вот так всё тоже работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // Применение функции возвращающей напибольший общий делитель                                                                   
28     cout << "<Применение функции возвращающей наибольший общий делитель>" << endl;                                                  
29     cout << "Введите 2 значения: ";                                                                                                 
30     int dig1 = 0, dig2 = 0;                                                                                                         
31     (cin >> dig1).get();                                                                                                            
32     (cin >> dig2).get();                                                                                                            
33     // cin >> dig1 >> dig2;                                                                                                         
34     cout << rgcd(dig1, dig2) << endl;                                                                                               
35                                                                                                                                     
36     cout << "<Применение функции отобращающе строку в обратном порядке>" << endl;                                                   
37     cout << "Введите строку: ";                                                                                                     
38     char a[80];                                                                                                                     
39     gets(a); // ВОТ НА ЭТОМ МЕСТЕ ПРОГРАММА ЗАВЕРШАЕТСЯ!                                                                            
40     reverse(a);                                                                                                                     
41     return EXIT_SUCCESS;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2012, 01:21     Не производиться ввод при помощи функции gets(s)
Еще ссылки по теме:

Проверка при помощи вложенных блоков try C++
При помощи функции вывести на экран фигуру в виде буквы "Н". C++
C++ Обработка массивов при помощи процедур

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2012, 01:21     Не производиться ввод при помощи функции gets(s) #20
Цитата Сообщение от xtorne21st Посмотреть сообщение
Не прописывать же всегда (cin >> dig2).get(); которая, как работает, пока для меня загадка...
Почему не прописать, если нужно? Работает очень просто. cin >> возвращает cin. Это то же что и:
C++
1
2
cin >> dig2;
cin.get();
После cin >> dig2; в потоке остаётся символ новой строки '\n' (попадает туда при нажатии Enter). cin.get() извлечёт его. Если не извлечь, то для функций срокового чтения (getline(), gets()), которые следуют за cin >>, он оказывается первым символом для чтения. Например, для getline() это пустая строка. Она извлечёт '\n', в массив, куда идёт чтение, запишет '\0' и код пойдёт дальше.

Добавлено через 3 минуты
Если нужно не один символ извлечь, а всё, что есть в потоке ввода (до '\n' и сам '\n'), то можно использавать конструкцию из 18 поста:
C++
1
2
cin.clear(); // если при вводе произошла ошибка, то сбпрос флага ошибки, иначе поток ввода нерабочий
while (cin.get() != '\n'); // извлечёт по символу всё из потока
Yandex
Объявления
31.10.2012, 01:21     Не производиться ввод при помощи функции gets(s)
Ответ Создать тему
Опции темы

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